numpy:将数组列表映射到数组数组

时间:2020-04-30 13:41:38

标签: python numpy

我正在尝试将numpy数组列表(包含单个字符串)映射到数组数组。我想要这个,是因为我需要它采用特定格式才能将其保存到.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 个答案:

答案 0 :(得分:1)

var2 是一个NumPy数组,但是当您打印NumPy数组时,它恰好显示类似于列表的内容,尽管如果您打印带有该内容的嵌套列表,您将看到它不是以垂直格式打印的。

打印var1会在列表中的每个数组周围显示array(...)的原因是因为var1list,而不是NumPy数组。当您打印list时,您会看到对象的字符串repr表示,它不一定与对象在打印时的显示方式匹配。如果您进行print(repr(var2)),则会在其周围看到array(...)

无论如何,您始终可以使用type来检查对象的类型。

答案 1 :(得分:0)

从数组列表开始:

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')]

从该数组中创建一个数组-具有字符串dtype(默认np.array行为)的2d数组:

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)

numpy数组是奇异的鸟,需要更复杂的构造。