假设我有:arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
还有空矩阵:
matrix = np.zeros((10, 10))
matrix[:] = np.NaN
我想用arr1
中的每个元素填充matrix
,但要对角填充。
array([[ nan, nan, nan, nan, nan, nan, nan, nan, nan, nan],
[ 1, nan, nan, nan, nan, nan, nan, nan, nan, nan],
[ 6, 2, nan, nan, nan, nan, nan, nan, nan, nan],
[ 11, 7, 3, nan, nan, nan, nan, nan, nan, nan],
[ 16, 12, 8, 4, nan, nan, nan, nan, nan, nan],
[ 21, 17, 13, 9, 5, nan, nan, nan, nan, nan],
[ nan, 22, 18, 14, 10, nan, nan, nan, nan, nan],
[ nan, nan, 23, 19, 15, nan, nan, nan, nan, nan],
[ nan, nan, nan, 24, 20, nan, nan, nan, nan, nan],
[ nan, nan, nan, nan, 25, nan, nan, nan, nan, nan]])
这就是我迄今为止尝试过但没有成功的:
arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
matrix = np.zeros((10, 10))
matrix[:] = np.NaN
for i, array in enumerate(arr1):
for row_matrix in matrix:
row_matrix = np.diag(array, -i-1)
break
下面是上面代码的输出:
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 21, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 22, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 23, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 24, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0]])
2条答案
按热度按时间svmlkihl1#
请尝试:
印刷品:
70gysomp2#
无任何迭代
只要利用一个事实,即有n个值,n+1之间的nan,当你读“从左到右,逐行”转置想要的结果。所以,好吧,我们简单地在一个10 x11矩阵中做,其中,当复制时,arr 1的值具有完全相同的属性(每行5个值,然后6个nan)。因此,在调整到10 x10之后,这5个值然后6个nan意味着移位)。
所以,一切都是关于复制数据在1列太大的矩阵,然后调整它的大小。加上一些转置发挥。
计时
对于5x 5示例
| 检查方法|时间|
| - -|- -|
| 你的|35.3微秒|
| 安德烈的|15.7微秒|
| 这个|9.1微秒|
在5000 x5000示例上
| 检查方法|时间|
| - -|- -|
| 你的|七十点二四秒|
| 安德烈的|0.54秒|
| 这个|0.31秒|