Numpy: отобразить список массивов в массив массивов - PullRequest
1 голос
/ 30 апреля 2020

Я пытаюсь сопоставить список numpy массивов (содержащих одну строку) с массивом массивов. Я хочу это, потому что мне нужно, чтобы он был в указанном формате c, чтобы сохранить его в файл .mat.

В настоящее время у меня есть следующее:

var1 = [array(['String1'], dtype='<U9'), array(['String2'], dtype='<U9'), ...]
var2 = np.asarray(var1)

output when printing var2: 
[['String1']
 ['String2']
 ['String3']
 ...]

Кажется, что создается список списков, а не какой-то массив массивов. Может быть, .asarray просто не может обрабатывать 2D-массивы, и мне нужна другая функция? Или я делаю здесь простую ошибку.

Expected output:
array([[array(['String1'], dtype='<U9'),
        array(['String2'], dtype='<U9'),
        array(['String3'], dtype='<U9'),
        ...]], dtype=object)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

var2 - это массив * NumPy, но когда вы печатаете массив NumPy, это просто показывает что-то похожее на список, хотя если вы печатаете вложенный список с этим содержимым, вы увидит, что он не печатается в этом вертикальном формате.

Причина, по которой печать var1 показывает array(...) вокруг каждого массива в списке, заключается в том, что var1 - это list, а не NumPy массив. Когда вы печатаете list, вы видите строку repr esentation объекта, которая не обязательно совпадает с тем, как объект отображается при печати. Если вы сделаете print(repr(var2)), то увидите вокруг него array(...).

В любом случае вы всегда можете использовать type, чтобы проверить тип вашего объекта.

0 голосов
/ 30 апреля 2020

Вы начинаете со списка массивов:

In [49]: var1 = [np.array(['String1'], dtype='<U9'), np.array(['String2'], dtype='<U9')]               
In [50]: var1                                                                                          
Out[50]: [array(['String1'], dtype='<U9'), array(['String2'], dtype='<U9')]

Создание массива из этого - 2d-массив со строкой dtype (поведение по умолчанию np.array):

In [51]: var2 = np.array(var1)                                                                         
In [52]: var2                                                                                          
Out[52]: 
array([['String1'],
       ['String2']], dtype='<U9')      # (2,1) shape

с указанием объект dtype по-прежнему создает массив (2,1)

In [53]: var3 = np.array(var1, object)                                                                 
In [54]: var3                                                                                          
Out[54]: 
array([['String1'],
       ['String2']], dtype=object)      # the objects are python strings

Чтобы создать массив массивов, сначала необходимо создать пустой массив, а затем заполнить его:

In [55]: var3 = np.empty(2, object)                                                                    
In [56]: var3                                                                                          
Out[56]: array([None, None], dtype=object)
In [57]: var3[:] = var1                                                                                
In [58]: var3                                                                                          
Out[58]: 
array([array(['String1'], dtype='<U9'), array(['String2'], dtype='<U9')],
      dtype=object)

Если список содержит массивы различной длины, вы можете использовать np.array, но, как показано, это не надежная конструкция (но распространенная, хотя бы по ошибке):

In [61]: np.array([np.array(['String1'], dtype='<U9'), np.array(['String2', 'string3'], dtype='<U9')]) 
Out[61]: 
array([array(['String1'], dtype='<U9'),
       array(['String2', 'string3'], dtype='<U9')], dtype=object)

A numpy array массивов - странная птица и требует более замысловатой конструкции.

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