изменить структуру массива Python в обычный массив NumPy - PullRequest
0 голосов
/ 18 июня 2019

У меня есть структурный массив, который выглядит следующим образом

[(1, 2, 3, 4) (5, 6, 7, 8)]

, и я удалил первый столбец и сделал его похожим на это

[(2, 3, 4) (6, 7, 8)]

, но когда я изменил его в массив,это выглядит так:

[[1 2 3 4]
 [5 6 7 8]]

"1" и "5" не должны были быть там

Это мой код

import numpy as np

array = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4'),('d', 'i4')])
names = list(array.dtype.names)
new_names=names[1:]
data = array[new_names]
new_array = data.view('i4').reshape(len(data),-1)

могу я узнать почемуи как его редактировать?

Ответы [ 2 ]

1 голос
/ 18 июня 2019
In [128]: array = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', '
     ...: i4'),('d', 'i4')]) 
     ...: names = list(array.dtype.names) 
     ...: new_names=names[1:] 
     ...: data = array[new_names]                                                         
In [129]: array.dtype                                                                     
Out[129]: dtype([('a', '<i4'), ('b', '<i4'), ('c', '<i4'), ('d', '<i4')])
In [130]: names                                                                           
Out[130]: ['a', 'b', 'c', 'd']
In [131]: data                                                                            
Out[131]: 
array([(2, 3, 4), (6, 7, 8)],
      dtype={'names':['b','c','d'], 'formats':['<i4','<i4','<i4'], 'offsets':[4,8,12], 'itemsize':16})

Обратите внимание, что data.dtype имеет offsets. В последних версиях numpy при выборе подмножества полей получается view. array['a'] все еще там, просто «скрыто».

Наряду с этим изменением они добавили некоторые функции в recfunctions:

In [133]: import numpy.lib.recfunctions as rf 

Чтобы сделать копию без данных 'a':

In [134]: data1 = rf.repack_fields(data)                                                  
In [135]: data1                                                                           
Out[135]: 
array([(2, 3, 4), (6, 7, 8)],
      dtype=[('b', '<i4'), ('c', '<i4'), ('d', '<i4')])

и сделать неструктурированный массив:

In [136]: rf.structured_to_unstructured(array)                                            
Out[136]: 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]], dtype=int32)
In [137]: rf.structured_to_unstructured(data)                                             
Out[137]: 
array([[2, 3, 4],
       [6, 7, 8]], dtype=int32)
In [138]: rf.structured_to_unstructured(data1)                                            
Out[138]: 
array([[2, 3, 4],
       [6, 7, 8]], dtype=int32)

Эти функции описаны по адресу:

https://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields

Поскольку все поля имеют одинаковый dtype ('i4'), view работает - до степени

In [142]: data.view('i4')                                                                 
Out[142]: array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32)
In [143]: data1.view('i4')                                                                
Out[143]: array([2, 3, 4, 6, 7, 8], dtype=int32)

Но это представление базовых данных, и форма испорчена. Эта проблема формы существовала в более ранних версиях. Поэтому лучше ознакомиться с изменениями и использовать рекомендуемые функции.

В предыдущих вопросах SO я мог бы рекомендовать использовать список в качестве посредника:

In [144]: data.tolist()                                                                   
Out[144]: [(2, 3, 4), (6, 7, 8)]
In [145]: np.array(data.tolist())                                                         
Out[145]: 
array([[2, 3, 4],
       [6, 7, 8]])
0 голосов
/ 18 июня 2019

Попробуйте нарезать в конце:

new_array = data.view('i4').reshape(len(data),-1)[:,1:]

Результат:

[[2 3 4]
 [6 7 8]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...