Допустим, edata и tdata два двухмерных массива numpy с формой (x, 6) и (y, 6), где x и y - два произвольных числа и не должны быть равны. Теперь мне нужно проверить, есть ли какая-либо строка в edata, чтобы значение 2-го и 3-го столбца этой строки было равно значению некоторой строки tdata. Если есть такие строки, сохраните их в другом. На данный момент я написал следующий код. Но я думаю, что у numpy есть лучший способ вместо явной итерации и проверки значений. Вы можете предложить мне более эффективный способ?
res = np.array([], dtype=np.float64).reshape(0,6)
for line in edata:
ind = line[1] == tdata[:,1]
ind = line[2] == tdata[ind,2]
if np.any(ind):
res = np.vstack((res,line))






Вы можете использовать equal и outer, чтобы увидеть, находится ли какое-либо значение в столбце edata в столбце tdata. Вы проверяете как 2-й, так и 3-й столбцы, затем используете any на axis=1, чтобы получить строки edata по мере необходимости, например:
res = edata[ (np.equal.outer(edata[:,1],tdata[:,1])
&np.equal.outer(edata[:,2],tdata[:,2])).any(1) ,:]
например, с простым вводом:
edata = np.arange(4*6).reshape(4,6)
tdata = np.arange(6*6).reshape(6,6) + 12
print (res)
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
последние две строки edata, которые имеют то же значение в столбцах 2 и 3, что и первые две строки tdata
@Eular, ваш метод (например, мой) возвращает все строки, и это имеет смысл, потому что 2-й и 3-й столбцы в обоих массивах одинаковы, не так ли? если предполагается, что возвращается только 1-я строка, то сопоставления как 2-го, так и 3-го столбцов недостаточно, но ваш вопрос (и связанный с ним код), похоже, указывает только совпадение 2-го и 3-го столбцов
Извините, я проверял 1-й и 2-й столбцы, у меня плохо
@Eular no pb :)
проверьте это два [[1,2,3], [2,3,4], [4,5,6]] и [[1,2,3], [1,3,4], [7, 5,6]], он должен возвращать только 1-ю строку