給定 3D arr,我想填充所有 dioganal 元素等于1.
np.random.seed(0)
arr=np.random.rand(3,4,4)
預期產出
1,0.71519,0.60276,0.54488
0.42365,1,0.43759,0.89177
0.96366,0.38344,1,0.52889
0.56804,0.92560,0.07104,1
1,0.83262,0.77816,0.87001
0.97862,1,0.46148,0.78053
0.11827,0.63992,1,0.94467
0.52185,0.41466,0.26456,1
1,0.56843,0.01879,0.61764
0.61210,1,0.94375,0.68182
0.35951,0.43703,1,0.06023
0.66677,0.67064,0.21038,1
分配fill_diagonal如下
arr=np.fill_diagonal(arr, 1)
回傳錯誤
ValueError:輸入的所有維度必須具有相同的長度
我可以知道如何為 3d 陣列正確填充等于 1 的對角線嗎
到目前為止正在嘗試什么
arr[:,:,0] = np.diag((1,1))
ValueError:無法將輸入陣列從形狀(2,2)廣播到形狀(3,4)
要避免什么
與for-loop_fill_diagonal
uj5u.com熱心網友回復:
嘗試這個:
r = np.arange(4)
arr[:, r, r] = 1
例子:
arr = np.arange(3*4*4).reshape(3,4,4)
r = np.arange(4)
arr[:, r, r] = 1
輸出:
array([[[ 1, 1, 2, 3],
[ 4, 1, 6, 7],
[ 8, 9, 1, 11],
[12, 13, 14, 1]],
[[ 1, 17, 18, 19],
[20, 1, 22, 23],
[24, 25, 1, 27],
[28, 29, 30, 1]],
[[ 1, 33, 34, 35],
[36, 1, 38, 39],
[40, 41, 1, 43],
[44, 45, 46, 1]]])
uj5u.com熱心網友回復:
這是最好的方法
import numpy as np
np.random.seed(0)
arr=np.random.rand(3,4,4)
d1, d2, d3 = arr.shape
for i in range(d1):
np.fill_diagonal(arr[i,:,:], 1)
uj5u.com熱心網友回復:
您可以使用np.diag_indices為 2D 子陣列的對角線生成索引,然后使用索引和分配值的視圖:
import numpy
rng = np.random.default_rng(0)
arr = rng.random((3,4,4))
diag = np.diag_indices(4, ndim=2)
for d1 in range(arr.shape[0]):
arr_view = arr[d1, :]
arr_view[diag] = 1
如果您的所有尺寸都相同(形狀為(n, n, n)),您可以直接使用np.fill_diagonal您之前嘗試過的功能。
編輯:
不使用 for 回圈,您可以使用
rng = np.random.default_rng(0)
arr = rng.random((3,4,4))
# Build a custom indexing with proper broadcasting
diag = np.arange(arr.shape[0])[:, None], *np.diag_indices(arr.shape[1], ndim=2)
arr[diag] = 1
這是有效的,因為該np.diag_indices(n, ndim=m)函式只給你一個m-形的(n)ndarrays 元組。因此,如果你有一個陣列,你可以用一個(k)- 形的 ndarray來增加回傳值。(k, n, n)為了讓 Numpy 能夠將三個陣列廣播到正確的形狀,您只需None向第一個 ndarray 添加一個新軸(通過 )。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441541.html
上一篇:numpy多項式解釋
下一篇:將高斯噪聲添加到numpy陣列
