Numpy проверить два массива в нескольких столбцах

Допустим, 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))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
1

Ответы 1

Вы можете использовать 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

проверьте это два [[1,2,3], [2,3,4], [4,5,6]] и [[1,2,3], [1,3,4], [7, 5,6]], он должен возвращать только 1-ю строку

Eular 22.11.2018 20:00

@Eular, ваш метод (например, мой) возвращает все строки, и это имеет смысл, потому что 2-й и 3-й столбцы в обоих массивах одинаковы, не так ли? если предполагается, что возвращается только 1-я строка, то сопоставления как 2-го, так и 3-го столбцов недостаточно, но ваш вопрос (и связанный с ним код), похоже, указывает только совпадение 2-го и 3-го столбцов

Ben.T 22.11.2018 20:23

Извините, я проверял 1-й и 2-й столбцы, у меня плохо

Eular 22.11.2018 20:44

@Eular no pb :)

Ben.T 22.11.2018 20:59

Другие вопросы по теме