Как посетить пользовательский элемент массива numpy в виде массива? - PullRequest
1 голос
/ 28 марта 2020

Я пытался реализовать свой пользовательский тип данных кватернионов, который имеет 4 члена: w, x, y, z. И я нашел официальный пример кода: https://github.com/numpy/numpy-dtypes/tree/master/npytypes/quaternion

Я протестировал эту реализацию следующим образом:

import numpy as np
import npytypes.quaternion

a = np.zeros((2, 2), dtype=np.float).astype(np.quaternion)
print(a)
print(a[0][0].w) # correct, get 0.0
print(a.w) # wrong, AttributeError: 'numpy.ndarray' object has no attribute 'w'

И я получил:

[[quaternion(0, 0, 0, 0) quaternion(0, 0, 0, 0)]
 [quaternion(0, 0, 0, 0) quaternion(0, 0, 0, 0)]]
0.0
Traceback (most recent call last):
  File "e:/..../test.py", line 7, in <module>
    print(a.w)
AttributeError: 'numpy.ndarray' object has no attribute 'w'

То, что я ожидал, было похоже:

>>> a.w
array([[0.0, 0.0], [0.0, 0.0]], dtype=np.float)

И мой вопрос заключается в том, как я могу изменить этот код для достижения этой цели ?

np.complex сделал это скважина:

>>> import numpy as np
>>> a = np.random.rand(2, 3).astype(np.complex)
>>> a
array([[0.94226049+0.j, 0.71994713+0.j, 0.718848  +0.j],
       [0.57285105+0.j, 0.35576711+0.j, 0.51016149+0.j]])
>>> a.real
array([[0.94226049, 0.71994713, 0.718848  ],
       [0.57285105, 0.35576711, 0.51016149]])
>>> a.real.dtype
dtype('float64')

1 Ответ

1 голос
/ 28 марта 2020

Можно подумать, что массивы сложного dtype имеют дополнительные атрибуты, но это, вероятно, потому, что вы не пытались получить доступ к arr.real или arr.imag для массива не сложного dtype. Оно работает. Эти атрибуты не являются чем-то конкретным c для сложных dtypes - они являются базовыми NumPy функциональными возможностями массива. (Кроме того, np.complex - это просто псевдоним обратной совместимости для обычного типа Python complex - когда вы указываете complex в качестве dtype, NumPy автоматически интерпретирует это как запрос сложного128 dtype NumPy. )

np.ndarray не имеет поддержки того, что вы пытаетесь. Вы могли бы создать подкласс np.ndarray, если бы вы действительно этого хотели, но это запуталось и не помогло бы с обычными массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...