簡體   English   中英

創建一個矩陣,其中每個元素等於其行和列索引的最小值

[英]Creating a matrix where each element is equal to the minimum of its row and column index

我想創建一個矩陣C,其中每個元素等於其對應的行和列索引的最小值。 例如:與第一行和第二列對應的元素的值應為1,與第八行和第三列對應的元素的值應為3,依此類推。

我編寫了以下代碼,這些代碼可以使我得到想要的東西。 運行以下代碼:

from numpy import empty

C = empty(shape=(32,32))

for j in range(1,33):
    for i in range(1,33):
        minimum = min(i,j)
        C[i-1][j-1] = minimum

print(C)

結果是

[[  1.   1.   1. ...,   1.   1.   1.]
 [  1.   2.   2. ...,   2.   2.   2.]
 [  1.   2.   3. ...,   3.   3.   3.]
 ..., 
 [  1.   2.   3. ...,  30.  30.  30.]
 [  1.   2.   3. ...,  30.  31.  31.]
 [  1.   2.   3. ...,  30.  31.  32.]]

問題:這是最有效的方法嗎? 如果不; 如何改進這種方法?

選項1
np.mgrid

np.mgrid[1:33, 1:33].min(axis=0)

array([[ 1,  1,  1, ...,  1,  1,  1],
       [ 1,  2,  2, ...,  2,  2,  2],
       [ 1,  2,  3, ...,  3,  3,  3],
       ...,
       [ 1,  2,  3, ..., 30, 30, 30],
       [ 1,  2,  3, ..., 30, 31, 31],
       [ 1,  2,  3, ..., 30, 31, 32]])

選項2
np.indices

(np.indices((32, 32)) + 1).min(axis=0)

array([[ 1,  1,  1, ...,  1,  1,  1],
       [ 1,  2,  2, ...,  2,  2,  2],
       [ 1,  2,  3, ...,  3,  3,  3],
       ...,
       [ 1,  2,  3, ..., 30, 30, 30],
       [ 1,  2,  3, ..., 30, 31, 31],
       [ 1,  2,  3, ..., 30, 31, 32]])

另一種方法是執行上三角矩陣的累加總和,該矩陣沿每一列包含全1:

In [16]: np.cumsum(np.triu(np.ones((32,32))), axis=0)
Out[16]:
array([[  1.,   1.,   1., ...,   1.,   1.,   1.],
       [  1.,   2.,   2., ...,   2.,   2.,   2.],
       [  1.,   2.,   3., ...,   3.,   3.,   3.],
       ...,
       [  1.,   2.,   3., ...,  30.,  30.,  30.],
       [  1.,   2.,   3., ...,  30.,  31.,  31.],
       [  1.,   2.,   3., ...,  30.,  31.,  32.]])

顯然不如mgrid方法有效,但我認為這是一種不錯的選擇。

暫無
暫無

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

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