Использовать структурированный массив для именования оси в массиве - PullRequest
0 голосов
/ 28 января 2019

Я, должно быть, делаю какую-то действительно тривиальную ошибку, но я пытаюсь создать структурированный массив с именами для одной оси, например, у меня есть массив data с формой (2, 3, 4), и я хочуназовите первую ось так, чтобы я мог получить доступ к data['a'] и data['b'], в обоих случаях получим срезы (3, 4).Я попытался:

shape = (2, 3, 4)
data = np.arange(np.product(shape)).reshape(shape)

dtype = [(nn, float) for nn in ['a', 'b']]
data = np.array(data, dtype=dtype)

Но, похоже, это дублирует все данные как в 'a', так и в 'b', например,

print(data.shape)
print(data['a'].shape)
> (2, 3, 4)
> (2, 3, 4)

Я попытался указать эту форму (вспецификация dtype) должна быть (3, 4), но это дублирует данные еще 12 раз ... и я попытался изменить порядок осей на (3, 4, 2), но это ничего не делает.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 28 января 2019
In [263]: shape = (2, 3, 4)
     ...: data = np.arange(np.product(shape)).reshape(shape)
     ...: 
     ...: dtype = [(nn, float) for nn in ['a', 'b']]

Хотя возможно преобразование data, более надежный подход состоит в том, чтобы создать нужный целевой массив и скопировать в него значения:

In [264]: res = np.zeros(shape[1:], dtype)
In [265]: res['a'] = data[0]
In [266]: res['b'] = data[1]
In [267]: res
Out[267]: 
array([[( 0., 12.), ( 1., 13.), ( 2., 14.), ( 3., 15.)],
       [( 4., 16.), ( 5., 17.), ( 6., 18.), ( 7., 19.)],
       [( 8., 20.), ( 9., 21.), (10., 22.), (11., 23.)]],
      dtype=[('a', '<f8'), ('b', '<f8')])
In [268]: res['a'].shape
Out[268]: (3, 4)

В этом структурированном массиве запись состоит изиз 2-х чисел и буфера данных, содержит:

In [272]: res.view(float).ravel()
Out[272]: 
array([ 0., 12.,  1., 13.,  2., 14.,  3., 15.,  4., 16.,  5., 17.,  6.,
       18.,  7., 19.,  8., 20.,  9., 21., 10., 22., 11., 23.])

Это отличается от data, [0,1,2,3,...].Таким образом, не существует какого-либо вида преобразования, представления или astype, которые будут преобразовывать одно в другое.

Таким образом, существует простое отображение из структурированного массива в (3,4,2) массив, но неваш источник.

In [273]: res.view(float).reshape(3,4,2)
Out[273]: 
array([[[ 0., 12.],
        [ 1., 13.],
        [ 2., 14.],
        [ 3., 15.]],

       [[ 4., 16.],
        [ 5., 17.],
        [ 6., 18.],
        [ 7., 19.]],

       [[ 8., 20.],
        [ 9., 21.],
        [10., 22.],
        [11., 23.]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...