将简单列表转换为具有正确形状的 Numpy arr

Converting simple list to Numpy arr with correct shape

我正在将(文本字符串的)列表列表转换为一个数组,但是不断发现自己 1) 打印形状然后 2) 手动执行 np.reshape 到 'transform' 数组所以数据按行排列,而不是无穷无尽的列。

无论如何,我是否可以在最初创建具有正确转换的数组,以避免每次都必须手动重新整形?

例如我有一个二维列表如下:

a = [['foo', 'bar', 'baz', 'qux']]

我使用以下方法转换为数组:

b = np.array(a)

使用b.shape时的形状是:(4,)

但是我需要它 (4,1) (and use b = b.reshape(4,1)) 看起来像这样:

a = [['foo'],
['bar'],
['baz'],
['qux']]

如何创建数组使其最初变为 (4,1) 而不是使用手动整形?

您的列表列表确实创建了一个 (4,1) 数组。那么问题出在哪里?

In [41]: a = [['foo'],
    ...: ['bar'],
    ...: ['baz'],
    ...: ['qux']]
In [42]: arr = np.array(a)
In [43]: arr
Out[43]: 
array([['foo'],
       ['bar'],
       ['baz'],
       ['qux']], dtype='<U3')
In [44]: arr.shape
Out[44]: (4, 1)

如果您从扁平列表开始,则需要重新调整形状:

In [45]: b= arr.ravel().tolist()
In [46]: b
Out[46]: ['foo', 'bar', 'baz', 'qux']
In [47]: np.array(b)
Out[47]: array(['foo', 'bar', 'baz', 'qux'], dtype='<U3')
In [48]: np.array(b).reshape(-1,1)
Out[48]: 
array([['foo'],
       ['bar'],
       ['baz'],
       ['qux']], dtype='<U3')

reshape(和 ravel)在 numpy 中是微不足道的。这就是我从 arr 创建 b 而不是编辑原始 a 列表的原因。

numpy 数组 shape 密切反映了列表的嵌套/[].

如果您得到的是 1d 形状,而您期望的是 2d,请检查 dtype,并注意任何 'ragged array' 警告:

In [50]: a = [['foo'],
    ...: ['bar'],
    ...: ['baz'],
    ...: ['qux','extra']]
In [51]: np.array(a)
<ipython-input-51-103c848ebb38>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  np.array(a)
Out[51]: 
array([list(['foo']), list(['bar']), list(['baz']),
       list(['qux', 'extra'])], dtype=object)
In [52]: _.shape
Out[52]: (4,)

编辑

如果您有一个包含 一个 列表的列表,您将得到一个 (1,n) 数组。那应该是显而易见的。它只是遵循列表的嵌套:

In [53]: a = [['foo', 'bar', 'baz', 'qux']]
In [54]: arr = np.array(a)
In [55]: arr
Out[55]: array([['foo', 'bar', 'baz', 'qux']], dtype='<U3')
In [56]: arr.shape
Out[56]: (1, 4)
In [57]: arr.T
Out[57]: 
array([['foo'],
       ['bar'],
       ['baz'],
       ['qux']], dtype='<U3')

它重塑为 (4,1) 同样容易:

In [58]: np.array(a).reshape(-1,1)
Out[58]: 
array([['foo'],
       ['bar'],
       ['baz'],
       ['qux']], dtype='<U3')