我问了关于dtype
的问题,因为你的例子让人感到困惑。
我可以创建一个有3个元素(1d)和3个字段的结构化数组:
In [1]: A = np.ones((3,), dtype='i,i,i')
In [2]: A
Out[2]:
array([(1, 1, 1), (1, 1, 1), (1, 1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
我可以通过名称访问一个字段(添加括号不会改变任何东西)
In [3]: A['f0'].shape
Out[3]: (3,)
但是如果我访问两个字段,我仍然得到一个一维数组
In [4]: A[['f0','f1']].shape
Out[4]: (3,)
In [5]: A[['f0','f1']]
Out[5]:
array([(1, 1), (1, 1), (1, 1)],
dtype=[('f0', '<i4'), ('f1', '<i4')])
实际上,那些额外的括号确实很重要,如果我查看值的话。
In [22]: A['f0']
Out[22]: array([1, 1, 1], dtype=int32)
In [23]: A[['f0']]
Out[23]:
array([(1,), (1,), (1,)],
dtype=[('f0', '<i4')])
如果数组是一个简单的二维数组,我仍然不明白你的形状。
In [24]: A=np.ones((3,3),int)
In [25]: A[0].shape
Out[25]: (3,)
In [26]: A[[0]].shape
Out[26]: (1, 3)
In [27]: A[[0,1]].shape
Out[27]: (2, 3)
但是,无论索引返回1d还是2d,确保数组是2d的问题,您的函数基本上是可以的。
def reshape_to_vect(ar):
if len(ar.shape) == 1:
return ar.reshape(ar.shape[0],1)
return ar
你可以测试 `ar.ndim` 而不是 `len(ar.shape)`。但无论哪种方式,它都不会很耗费 - 也就是说,执行时间很短 - 不会有大的数组操作。`reshape` 不会复制数据(除非你的步幅很奇怪),因此它只是创建一个带有共享数据指针的新数组对象的成本。
看看 `np.atleast_2d` 的代码;它测试了 0 维和 1 维。在 1 维情况下,它返回 `result = ary[newaxis,:]`。它首先添加额外的轴,这是添加轴的更自然的 `numpy` 位置。你将它添加在结尾。
`ar.reshape(ar.shape[0],-1)` 是绕过 `if` 测试的巧妙方法。在小的计时测试中,它更快,但我们谈论的是微秒级别的函数调用层的影响。
`np.column_stack` 是另一个如果需要则创建列数组的函数。它使用:
if arr.ndim < 2:
arr = array(arr, copy=False, subok=True, ndmin=2).T
dtype
?看起来很“结构化”。 - hpaulj