将简单列表转换为具有正确形状的 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')
我正在将(文本字符串的)列表列表转换为一个数组,但是不断发现自己 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')