如何修改numpy矩阵的元素



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

这是我尝试过的:

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

这是一个极简的修改(UPDATED使用np。数组)到你的代码,我相信你会问:

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的矩阵开始,并且您想将其更改为满足random()标准的0

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

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()函数。

最新更新