如何根据Python中的另一个数组修改删除数组中的元素

如何根据Python中的另一个数组修改删除数组中的元素,python,arrays,numpy,Python,Arrays,Numpy,我有两个阵列: x=np.array([0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,1]) y=np.array([y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12]) 其中元素y_i仅对应于数组x中的0元素 我想修改x中的一个随机0元素,使其为1。此时,我必须删除y中相应的元素(因为y在数组x中只包含与0相关的元素) [编辑:]例如,我有 x=np.array([0,0,0,0,0,1,1,0,0,1,0] y=np.array([

我有两个阵列:

x=np.array([0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,1])
y=np.array([y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,y10,y11,y12])
其中元素y_i仅对应于数组x中的0元素

我想修改x中的一个随机0元素,使其为1。此时,我必须删除y中相应的元素(因为y在数组x中只包含与0相关的元素)

[编辑:]例如,我有

x=np.array([0,0,0,0,0,1,1,0,0,1,0]
 y=np.array([21,32,45,54,87,90,88,60])

使得x[0]对应于y[0]=21,x[1]>y[1]=32,x[2]>y[2]=45,x[3]>y[3]=54,x[4]>y[4]=87,x[7]>y[5]=90,x[8]>y[6]=88,x[10]>y[7]=60。如果我将x[2]、x[7]和x[10]从0更改为1,我想取消y中的相应元素,即45、90和60,这可能就是您要查找的:

x_0 = np.where(x==0)[0]

rand_ind = np.random.randint(1,len(x_0))

x[x_0[rand_ind]] = 1;

y = np.delete(y, rand_ind)
x_0
x
中的元素数组,最初等于0
rand_ind
是从
x_0
长度范围中选择的随机索引。要将0更改为1,程序使用
x\u 0[rand\u ind]
,而要删除y中的相应元素,程序只需使用
rand\u ind


这是更新问题的修改解决方案

import numpy as np
import random

x_0 = np.where(x==0)[0]

rand_ind = np.array(random.sample(list(x_0), 3))

x[rand_ind] = 1

y = np.delete(y, [np.where(x_0==i)[0] for i in rand_ind])
在这个解决方案中,rand_ind是x数组索引的直接选择,而不是修剪的x_0数组。它选择存储在x_0中的索引,以避免选择x中的值为1的索引。索引,即x_0的元素是x的索引,而x_0的索引对应于y中的索引/位置


程序使用
random.sample
作为一种简单的方法来随机选取N个元素而不重复(这里是3)。然后,它将x中的
rand_ind
处的元素转换为1,并删除y中相应的元素。最后一步是使用生成器,找到每个rand_ind值的x_0元素的索引

很高兴提供帮助:)最好的方法可能是简单地生成
rand_ind
作为数组,
randint
具有该选项。谢谢!但我还有一个问题。如果我更改数组x中第2和第7位置的值,您编写的程序不会删除y中的对应元素。。。我试着用python编写这个特定示例的代码,但它不能正常工作……我的意思是,例如,我有x=[0,0,0,0,0,1,0,0]和y=[21,45,32,98,12,5,3]。我想要从0到1的第2和第6个元素。所以你的程序就做到了。因为y中的元素只与空x元素相关,所以x和y之间的索引不会有对应关系,对吗?这样,我想删除元素32和5,因为它们对应于我更改的x元素。你的程序似乎没有从y中删除正确的元素,不是吗?谢谢你的讨论!就像我以前写的一样!尝试更好地解释:x=np.array([0,0,0,0,0,1,0,0])和y=np.array([21,45,32,98,12,5,3])。因此,x[0]对应于21=y[0],x[1]->45=y[1],x[2]->32=y[2],x[3]->98=y[3],x[4]->12=y[4],x[6]->5=y[5],x[7]->3=y[6]。y元素的指数在某一点上与x元素的指数不同。这是因为在x中有一个元素=1(即x[5],它与y中的任何元素都不相关)。如果我更改x[2]和x[6],我如何删除y中的相应元素,即y[2]=32和y[5]=5?我知道这是一种疯狂,但我需要这样做…如果你没有任何解决方案,也许最好在另一个线程中发布它,以获得更多的可见性。。。感谢您的讨论:)