У меня есть структурированный массив со смешанными типами:
dt = np.dtype([('x', np.float64), ('y', np.float64), ('n', np.uint32)])
arr = np.empty(10, dtype=dt)
Начиная с numpy 1.16 или около того, если я смотрю x
и y
, я получаю представление:
>>> sub = arr[['x', 'y']]
>>> sub
array([(6.23042070e-307, 4.67296746e-307),
(1.15710088e-306, 1.60221615e-306),
(1.95821574e-306, 6.23062102e-307),
(1.78019082e-306, 1.37959740e-306),
(1.37959129e-306, 1.33511562e-306),
(1.33511018e-306, 1.33511969e-306),
(1.11261027e-306, 1.11261502e-306),
(8.45593934e-307, 9.34600963e-307),
(6.23038336e-307, 1.29061142e-306),
(2.22522596e-306, 2.22522596e-306)],
dtype={'names':['x','y'], 'formats':['<f8','<f8'], 'offsets':[0,8], 'itemsize':20})
Это проблема, потому что я хотел бы иметь возможность преобразовать подмножество sub
в (10, 2)
представление полей x
и y
.
Я не могу просто используйте sub.view(dtype=np.float64)
. Это вызывает ошибку
ValueError: When changing to a smaller dtype, its size must be a divisor of the size of original dtype
Я могу использовать np.lib.stride_tricks.as_strided
, но это глупо и проблематично c, потому что это работает только тогда, когда я хочу два поля (или, альтернативно, любое количество полей с равным интервалом):
>>> shape = sub.shape + (2,)
>>> strides = (sub.dtype.itemsize,
np.diff([x[1] for x in sub.dtype.fields.values()]).item())
>>> np.lib.stride_tricks.as_strided(sub, shape=shape, strides=strides)['x']
array([[6.23042070e-307, 4.67296746e-307],
[1.15710088e-306, 1.60221615e-306],
[1.95821574e-306, 6.23062102e-307],
[1.78019082e-306, 1.37959740e-306],
[1.37959129e-306, 1.33511562e-306],
[1.33511018e-306, 1.33511969e-306],
[1.11261027e-306, 1.11261502e-306],
[8.45593934e-307, 9.34600963e-307],
[6.23038336e-307, 1.29061142e-306],
[2.22522596e-306, 2.22522596e-306]])
Если бы sub
была копией, то я мог бы просто просмотреть ее как массив (10, 2)
с плавающей точкой. Как я могу просмотреть выбранные поля как такой массив, скопировав выделение или любым другим способом?