如何按元素修改numpy矩阵

how to modify a numpy matrix element-wise

我目前正在尝试迭代一个矩阵并按照一些逻辑修改其中的元素。 我尝试使用迭代矩阵的标准过程,但这只会输出当前索引处的元素,而不会更新矩阵本身。

这是我试过的:

for row in initial_matrix:
    for element in row:
        if np.random.rand() > 0.5: element = 0
        print(element)

print(initial_matrix)

然而,这并没有更新initial matrix,我也试过了:

for row in range(len(initial_matrix)):
    for element in range(row):
        if np.random.rand() > 0.5: initial_matrix[row, element] = 0
        print(element)

print(initial_matrix)

这在某种程度上是有效的,但只在矩阵的下对角线,而上部保持不变。 这是输出:

0
0
1
0
1
2
0
1
2
3
[[1. 1. 1. 1. 1.]
 [0. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]
 [0. 0. 1. 1. 1.]
 [0. 1. 1. 0. 1.]]
import numpy as np
a = np.random.rand(3,4)
print(a)
b = np.random.rand(3,4) 
print(b)
a[ b > 0.5]=0
print(a)

a = a > 0.5
print(a.astype(int))

您可以像这样使用布尔结果对数组进行索引。 输出:

[[0.21577153 0.4810459  0.88036672 0.93817657]
 [0.48424368 0.88673521 0.26706288 0.47468637]
 [0.02435961 0.75210616 0.18391152 0.80976478]]
[[0.27385928 0.84570069 0.55326907 0.57076882]
 [0.11333208 0.26364198 0.26381841 0.57497278]
 [0.29163378 0.08612894 0.37857834 0.59921316]]
[[0.21577153 0.         0.         0.        ]
 [0.48424368 0.88673521 0.26706288 0.        ]
 [0.02435961 0.75210616 0.18391152 0.        ]]
[[0 0 0 0]
 [0 1 0 0]
 [0 1 0 0]]

如果你想输出整数形式的布尔数组,你可以使用 astype() 函数。

这是对您的代码的极简修改(UPDATED 以在整个过程中使用 np.array),我认为这将满足您的要求:

import numpy as np
initial_matrix = np.array([
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1],
[1,1,1,1,1]])
for row in range(len(initial_matrix)):
    for element in range(len(initial_matrix[row])):
        if np.random.rand() > 0.5:
            initial_matrix[row, element] = 0
print(initial_matrix)

输出:

[[0 1 1 1 0]
 [1 1 1 0 0]
 [0 0 0 0 0]
 [0 1 1 0 0]
 [1 0 0 1 0]]

在这里,我假设您从每个位置都包含 1 的矩阵开始,并且您希望将其更改为 0,满足您的 random() 标准。

如您所见,对原始代码的内部循环逻辑进行调整有助于使其正常工作。

import numpy as np 
initial_matrix = np.ones([10,5])
print(initial_matrix)

for row in initial_matrix:
    for element in row:
        if np.random.rand() > 0.5: 
            element = 0
# Nothing will change
print(initial_matrix)

基本上你不会用这种方法改变初始矩阵的值

  [[1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]
     [1. 1. 1. 1. 1.]]

为了更好地理解这一点,让我们举一个简单的例子

initial_list=[1,1,1,1]

for i in initial_list:
    i=0

print(initial_list)

这将输出初始列表,没有任何修改,因为你修改的是变量 i 而不是列表本身的内容,如果你想修改列表,你可以这样做:

initial_list=[1,1,1,1]

for i in range(len(initial_list)):
    initial_list[i]=0

print(initial_list)

现在让我们将同样的事情应用到您的问题中

    #Iterate through the rows and columns and change the initial matrix
    for i in range(initial_matrix.shape[0]):
        for j in range(initial_matrix.shape[1]):
            if np.random.rand() > 0.5: 
                initial_matrix[i,j] = 0
    print(initial_matrix)
[[0. 0. 0. 0. 0.]
 [0. 1. 1. 1. 0.]
 [0. 1. 0. 0. 1.]
 [0. 1. 0. 1. 1.]
 [1. 0. 1. 0. 1.]
 [0. 1. 1. 0. 0.]
 [0. 1. 0. 0. 1.]
 [1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]]