LINUX.ORG.RU

Numpy Structured Array

 , ,


0

3

Подскажите плз как с сабжем нормально работать? Цель - попытка заменить невероятно тормозной пандас.

Основная проблема - построчно с этой штукой отказывается работать большая часть np. Ну например надо тупо перемножить массив из одной строки с другим и подсчитать сумму элементов. Можно извратиться типа (A * np.asarray(B.item())).sum(), но это дичь какая-то.

я в целом понимаю что это связано с возможным (и крайне вероятным) различием dtype у каждого из элементов. Но блин, мне по факту в 99% случаев все что нужно от этого массива это имена полей. dtype в большинстве мест (кроме нескольких) у всех полей один и тот же. Может есть что-то еще кроме struct array для этого? Можно в целом держать dict с именами столбцов рядом, но это жесткий геморрой

★★★★★

Последнее исправление: upcFrost (всего исправлений: 1)

нашел занятный способ через доп поле с offset'ами. жесть. кхм

хотя учитывая что разрабы numpy походу очень любят void*, ничего удивительного

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от grem

как вариант хотя бы это. Вообще любая стандартная арифметика, но с structured массивом в качестве одного из аргументов

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от grem

капитан, спасибо. вот только со структурированными массивами это нифига не работает

пример массива ниже

import numpy as np

a = np.array([(1,2), (3,4)], dtype={'names':['a','b'], 'formats': ['f8', 'f8']})

цель - например умножить каждый элемент на 2 (без цикла, разумеется)

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 2)
Ответ на: комментарий от upcFrost
a['a'] *= 2
a['b'] *= 2

можно пройтись в цикле по полям dtype. Способ лучше я не знаю, больше того, официальные доки пишут, что

comparing void structured arrays, and arithmetic and bitwise operations are not supported

отсюда: https://docs.scipy.org/doc/numpy/user/basics.rec.html#indexing-and-assignment...

anonymous
()
Ответ на: комментарий от anonymous

Опередил.

ОП, не могу понять, чем тебя не устраивает чистый np.array.

Конвертируй из pandas, делай все операции и конвертируй обратно (если тебе это действительно нужно)

ZERG ★★★★★
()
Ответ на: комментарий от ZERG

ОП, не могу понять, чем тебя не устраивает чистый np.array

тем что рядом придется держать словарь с названиями полей. там пачка моделей юзает один основной массив, и разным нужны разные поля и в разном порядке

Конвертируй из pandas, делай все операции и конвертируй обратно (если тебе это действительно нужно)

и так на каждый цикл... не, это вообще жесть будет

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от anonymous

comparing void structured arrays, and arithmetic and bitwise operations are not supported

хреново.

плюс обнаружил что scipy не умеет юзать такие массивы в оптимизаторах (вернее не умеет их передать в фортрановую либу). голяк короче

upcFrost ★★★★★
() автор топика
Ответ на: комментарий от upcFrost
import numpy as np

a = np.array([(1,2), (3,4)], dtype={'names':['a','b'], 'formats': ['f8', 'f8']})
print("a:\n", a)

print("a.view:\n", a.view((a.dtype[0], len(a.dtype.names))) )

print("2 * a:\n", np.dot(2, a.view((a.dtype[0], len(a.dtype.names)))) )

вывод

a:
 [(1.0, 2.0) (3.0, 4.0)]
a.view:
 [[ 1.  2.]
 [ 3.  4.]]
2 * a:
 [[ 2.  4.]
 [ 6.  8.]]
grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от grem

Да, через view уже тоже нашел. Но тут начинаются радости с потерей во вьюхе имен столбцов. В плане что приходится крайне аккуратно следить что именно юзать на каждой строке - вьюху или сам массив. Плюс весь массив должен иметь один тип.

Но походу это самый адекватный вариант

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от upcFrost

Кажется, ругался.

там пачка моделей юзает один основной массив, и разным нужны разные поля и в разном порядке

А порядок их заранее известен и сохраняется от задачи к задачи?

не умеет их передать в фортрановую либу

Может тогда сразу фортрановские массивы использовать и, если нужно работать с отдельными столбцами и блоками, то обращаться к ним как к «срезу» через указатель или через associate (что внешне на вид практически одно и то же, но второе в пределах своего блока должно работать)?

Надо бы заботать как-нибудь основательнее и numpy и fortran :(

grem ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.