如何一個討厭的單線?
一,數據;數組的形狀與您的形狀相同,但我使用整數使示例更易於閱讀。
In [81]: A
Out[81]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [82]: B
Out[82]:
array([[ 0, 100, 200, 300, 400],
[ 500, 600, 700, 800, 900],
[1000, 1100, 1200, 1300, 1400],
[1500, 1600, 1700, 1800, 1900],
[2000, 2100, 2200, 2300, 2400]])
In [83]: C
Out[83]: array([1, 3, 2, 4, 0])
而這裏的骯髒的一行:
In [84]: np.insert(A.ravel(), np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1, B[range(B.shape[0]), C]).reshape(A.shape[0], A.shape[1]+1)
Out[84]:
array([[ 0, 1, 100, 2, 3, 4],
[ 5, 6, 7, 8, 800, 9],
[ 10, 11, 12, 1200, 13, 14],
[ 15, 16, 17, 18, 19, 1900],
[ 20, 2000, 21, 22, 23, 24]])
這裏是破舊的版本:
A.ravel()
變平A
成1-d陣列,我會打電話給F
:
In [87]: F = A.ravel()
In [88]: F
Out[88]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24])
(編輯:原來這第一步 - 展平A
- 沒有必要。正如@hpaulj在他的回答中指出的那樣,np.insert
會默認將該陣列展平。)
np.ravel_multi_index
用於將所需的二維位置轉換爲摺疊數組中的索引。
In [89]: insert_indices = np.ravel_multi_index((range(A.shape[0]), C), A.shape) + 1
In [90]: insert_indices
Out[90]: array([ 2, 9, 13, 20, 21])
B[range(B.shape[0]), C]
拉期望值出B
:
In [91]: values = B[range(B.shape[0]), C]
In [92]: values
Out[92]: array([ 100, 800, 1200, 1900, 2000])
np.insert
進行實際的+ 1
末,因爲你想後插入的元素在C
給出的指標是必要的插入並創建一個新陣列:
In [93]: np.insert(F, insert_indices, values)
Out[93]:
array([ 0, 1, 100, 2, 3, 4, 5, 6, 7, 8, 800,
9, 10, 11, 12, 1200, 13, 14, 15, 16, 17, 18,
19, 1900, 20, 2000, 21, 22, 23, 24])
現在只是重塑,要得到最終的結果是:
In [94]: np.insert(F, insert_indices, values).reshape(A.shape[0], A.shape[1]+1)
Out[94]:
array([[ 0, 1, 100, 2, 3, 4],
[ 5, 6, 7, 8, 800, 9],
[ 10, 11, 12, 1200, 13, 14],
[ 15, 16, 17, 18, 19, 1900],
[ 20, 2000, 21, 22, 23, 24]])
你是一個錯誤的例子結果(你不能將一個6元素數組賦給'A [i,:]',它只有5個元素的空間)。 – 2014-10-07 03:57:43
@WarrenWeckesser對不起,你是對的,我寫下了示例矩陣,並沒有多想太多。我正在修復:) – ProGM 2014-10-07 04:49:36
我調整了你的迭代工作。 – hpaulj 2014-10-07 06:56:27