我正在尝试将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)
答案 0 :(得分:1)
var2
是一个NumPy数组,但是当您打印NumPy数组时,它恰好显示类似于列表的内容,尽管如果您打印带有该内容的嵌套列表,您将看到它不是以垂直格式打印的。
打印var1
会在列表中的每个数组周围显示array(...)
的原因是因为var1
是list
,而不是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
数组是奇异的鸟,需要更复杂的构造。