我問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,)
但如果我獲得2場,我仍然得到一維數組
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')])
其實這些額外的支架做的事,如果我LOO處的K值
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')])
如果數組是一個簡單的2D一個,我還沒有得到你的形狀
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)
但至於製作的問題,確保陣列是2D,不管是否索引返回維或2,你的功能基本上確定
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
;它測試0d和1d。在1d的情況下,它返回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
這是無關緊要的,我只是用它作爲我如何以1d或2d數組結束的例子。我的問題是關於如何系統地優雅地將1d轉換爲2d數組。 – DevShark