簡體   English   中英

如何有效地連接2個Numpy數組?

[英]How concatenate 2 Numpy array efficiently?

我有2個Numpy數組<type 'numpy.ndarray'> ,形狀為(10,) (10, 6) <type 'numpy.ndarray'> (10,) (10, 6) ,我想將第一個與第二個連接起來。 下面提供的numpy數組,

r1 
['467c8100-7f13-4244-81ee-5e2a0f8218a8',
 '71a4b5b2-80d6-4c12-912f-fc71be8d923e',
 '7a3e0168-e47d-4203-98f2-a54a46c62ae0',
 '7dfd43e7-ced1-435f-a0f9-80cfd00ae246',
 '85dbc70e-c773-43ee-b434-8f458d295d10',
 'a56b2bc3-4a81-469e-bc5f-b3aaa520db05',
 'a9e8996f-ff35-4bfb-bbd9-ede5ffecd4d8',
 'c3037410-0c2e-40f8-a844-ac0664a05783',
 'c5618563-10c0-425b-a11b-2fcf931f0ff7',
 'f65e6cea-892e-4335-8e86-bf7f083b5f53'] 

r2 
[[1.55000000e+02, 5.74151515e-01, 1.55000000e+02, 5.74151515e-01, 3.49000000e+02, 1.88383585e+00],
 [5.00000000e+00, 1.91871554e-01, 1.03000000e+02, 1.22893828e+00, 2.95000000e+02, 3.21148368e+00],
 [7.10000000e+01, 1.15231270e-01, 2.42000000e+02, 5.78527276e-01, 4.09000000e+02, 2.67915246e+00],
 [3.60000000e+01, 7.10066720e-01, 2.42000000e+02, 1.80213634e+00, 4.12000000e+02, 4.16314391e+00],
 [1.15000000e+02, 1.05120284e+00, 1.30000000e+02, 1.71697773e+00, 2.53000000e+02, 2.73640301e+00],
 [4.70000000e+01, 2.19434656e-01, 3.23000000e+02, 4.84093786e+00, 5.75000000e+02, 7.00530186e+00],
 [5.50000000e+01, 1.22614463e+00, 1.04000000e+02, 1.55392099e+00, 4.34000000e+02, 4.13661261e+00],
 [3.90000000e+01, 3.34816889e-02, 1.10000000e+02, 2.54431753e-01, 2.76000000e+02, 1.52322736e+00],
 [3.43000000e+02, 2.93550948e+00, 5.84000000e+02, 5.27968165e+00, 7.45000000e+02, 7.57657633e+00],
 [1.66000000e+02, 1.01436635e+00, 2.63000000e+02, 2.69197514e+00, 8.13000000e+02, 7.96477735e+00]]

我試圖用命令np.concatenate((r1, r2)) ,它返回ValueError: all the input arrays must have same number of dimensions消息ValueError: all the input arrays must have same number of dimensions ,我不理解。 因為, r1可能與r2並置,並且可以形成一個全新的數組並生成一個10 x 7的新數組。

如何解決這個問題呢 ?

Numpy提供了沿第二個軸連接的簡便方法。

np.c_[r2,r1]

您可以重塑 r1使其具有二維r1 ,並指定連接數組所沿的axis

import numpy as np

r1 = np.ones((10,))
r2 = np.zeros((10, 6))
np.concatenate((r1.reshape(10, 1), r2), axis=1)

這2個數組的dtype和形狀不匹配:

In [174]: r1.shape
Out[174]: (10,)
In [175]: r1.dtype
Out[175]: dtype('<U36')

In [177]: r2.shape
Out[177]: (10, 6)
In [178]: r2.dtype
Out[178]: dtype('float64')

如果將尺寸添加到r1 ,現在它是(10,1),則可以在axis = 1上串聯。 但請注意dtype-浮點數已轉換為字符串:

In [181]: r12 =np.concatenate((r1[:,None], r2), axis=1)
In [182]: r12.shape
Out[182]: (10, 7)
In [183]: r12.dtype
Out[183]: dtype('<U36')
In [184]: r12[0,:]
Out[184]: 
array(['467c8100-7f13-4244-81ee-5e2a0f8218a8', '155.0', '0.574151515',
       '155.0', '0.574151515', '349.0', '1.88383585'], 
      dtype='<U36')

混合使用字符串和浮點數的一種方法是使用結構化數組,例如:

In [185]: res=np.zeros((10,),dtype='U36,(6)f')
In [186]: res.dtype
Out[186]: dtype([('f0', '<U36'), ('f1', '<f4', (6,))])
In [187]: res['f0']=r1
In [188]: res['f1']=r2
In [192]: res.shape
Out[192]: (10,)
In [193]: res[0]
Out[193]: ('467c8100-7f13-4244-81ee-5e2a0f8218a8', [ 155.        ,    0.57415152,  155.        ,    0.57415152,  349.        ,    1.88383579])

我們還可以使用dtype = object創建(10,7)數組。 但是大多數數組操作都無法將字符串和浮點數混合使用。 工作的速度較慢。

為什么要串聯這些數組? 您打算如何處理結果? dtype不匹配比形狀不匹配更嚴重。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM