[英]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.