Python试图更新2D numpy数组中的值,但值不';t更新
对不起,我是个巨蟒迷 我一直在试图找到代表x,y值的二维数组中的最大值 然后,应将最大值替换为0并绘制。然而,我已经尝试了许多方法来替换值,但我无法替换值 到目前为止,我的代码是Python试图更新2D numpy数组中的值,但值不';t更新,python,arrays,numpy,Python,Arrays,Numpy,对不起,我是个巨蟒迷 我一直在试图找到代表x,y值的二维数组中的最大值 然后,应将最大值替换为0并绘制。然而,我已经尝试了许多方法来替换值,但我无法替换值 到目前为止,我的代码是 m2= [ [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , [ 0 , 1 , 2 , 3 , 2 , 1 , 0 , 1 , 2 , 3 ]] a2 = np.array(m2, dtype=np.int) plt.plot(a2[0,:], a2[1,:], 'r-x')
m2= [ [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , [ 0 , 1 , 2 , 3 , 2 , 1 , 0 , 1 , 2 , 3 ]]
a2 = np.array(m2, dtype=np.int)
plt.plot(a2[0,:], a2[1,:], 'r-x')
a2maxy = np.max(a2[1,:])
print("a2 y values: ", a2[1,:])
for y in (a2[1,:]):
if (y==a2maxy):
print(y)
print("max found ", y)
y=0
print(y)
但是我的输出(显示最大y值不变)是
a2 y values: [0 1 2 3 2 1 0 1 2 3]
3
max found 3
0
3
max found 3
0
[[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 2 1 0 1 2 3]]
我认为您的问题在于,您实际上没有在
for
循环中引用要编辑的值数组。可能有一种更巧妙的方法可以做到这一点,但您可以在for
循环中作为迭代器来做您想做的事情,然后在a2
数组中引用您关心的项,如下所示:
import numpy as np
from matplotlib import pyplot as plt
m2= [ [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] , [ 0 , 1 , 2 , 3 , 2 , 1 , 0 , 1 , 2 , 3 ]]
a2 = np.array(m2, dtype=np.int)
plt.plot(a2[0,:], a2[1,:], 'r-x')
a2maxy = np.max(a2[1,:])
print("a2 y values: ", a2[1,:])
for idx,y in enumerate(a2[1,:]):
if (y==a2maxy):
print("max found ", y)
a2[1,idx]=0
print("new a2 y values: ", a2[1,:])
现在输出为:
a2 y values: [0 1 2 3 2 1 0 1 2 3]
max found 3
max found 3
new a2 y values: [0 1 2 0 2 1 0 1 2 0]
@lydiash给出的答案是正确的。但是,由于您是numpy的新手,我还想给您一些关于使用numpy的意义的见解:) 让我们稍微简化一下代码。我看到
a2
包含绘图的所有数据。但第一行表示x
值,仅用于打印,并且您仅使用实际的y
值。所以,让我们把他们分开
xs=np.arange(10)#精确地给出[0,1,2,3,4,5,6,7,8,9]
ys=np.数组([0,1,2,3,2,1,0,1,2,3])
plt.绘图(xs,ys,'r-x')
打印(f'y值:{ys}')#打印“y值:[01 2 3 2 1 0 1 2 3]”
在第二部分中,您将查找maxy
值并将其更改为零。当然,您可以在for
循环中完成。但是你也可以利用numpy向量运算的威力
当您使用y\u max=np.max(ys)
(也可以写成y\u max=ys.max()
)计算最大值时,您可以在一个跃点内直接更改ys
:
y_max=ys.max()
打印(f'max value found:{y_max}')#打印“max value found:3”
ys[ys==y_max]=0#这里发生了最大值变为零的情况!
print(f'newy-values:{ys}')#打印“newy-values:[0112021120]”
表达式ys==y_max
在ys
的所有索引上都是一个过滤器-只取匹配值的索引
可选说明:如果您想更好地理解
ys==y_max
零件,只需打印它给出的内容:
print(ys==y\u max)
#打印“[假假假假假真]”
#如您所见,`True`值正好位于最大值的位置
它为您提供了数组所有索引的掩码。您可以将其进一步用作某种过滤器-
ys[mask]
只返回由该掩码过滤的值
非常感谢您花时间解释:),我曾经尝试过np.where方法,但没有得到任何结果。where有点棘手,因为它根据您提供的参数数量做了两件稍有不同的事情-在您习惯numpy之前,我不建议您使用它。总的来说,numpy的每个功能都有大量的文档——请不要害羞地看它们)非常感谢您花时间回答这个问题,我现在明白我错在哪里了:)