У меня есть 2 массива, один из которых является Large_arr, а другой (подмножество) sub_arr. Я хочу сопоставить значения как массива, так и совпадающие значения массива будут возвращать индексы большого массива. У меня есть код, но он вызывает ошибку
Traceback (most recent call last):
File "C:/Users/hp/AppData/Local/Programs/Python/Python36/stack.py", line 36, in <module>
if(sub_arr[i]==Large_arr[j]):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Мой код
import numpy as np
Large_arr=np.array([[0.12046862, 0.64457892],
[0.47522597, 0.12350968],
[0.1649585 , 0.50135502],
[0.20104755 ,0.15218623],
[0.03772419 ,0.42482297],
[0.51633778 ,0.61209002],
[0.24848648 ,0.99651906],
[0.47374345, 0.09990318],
[0.58390815 ,0.19781604],
[0.9613725 ,0.45975827],
[0.99008266 ,0.13487207],
[0.14410988 ,0.36196475],
[0.81349573 ,0.55896232],
[0.72841399 ,0.02263056],
[0.8692731 ,0.9754183 ],
[0.87142787 ,0.66163271],
[0.24342035 ,0.95821073],
[0.94218857 ,0.7220602 ],
[0.66716105 ,0.96875209]])
sub_arr=np.array([[0.12046862, 0.64457892],
[0.51633778 ,0.61209002],
[0.99008266 ,0.13487207],
[0.72841399 ,0.02263056],
[0.24342035 ,0.95821073],
[0.47374345, 0.09990318],
[0.9613725 ,0.45975827]])
s=[]
for i in range(0,len(Large_arr)):
for j in range(0,len(sub_arr)):
if(sub_arr[i]==Large_arr[j]):
s.append(j)
print("Value of s is\n",s)
else:
print("Value is none\n")
Можно ли упростить этот метод. Итак, мой результат имеет ценность
S=[0,5,10,13,7,10,1] (example, index of large array where sub_array value stored)
Вы можете попробовать следующее:
result_indices = np.argwhere(np.in1d(Large_arr, sub_arr))
Это должно сначала применить булевую маску, а затем дать вам индексы соответствующих элементов.
Пожалуйста, поправьте меня, если это не то, что вы хотите в конце.
Я думаю, проблема может быть
if(sub_arr[i]==Large_arr[j]):
Действительно, кажется, что у вас есть два двумерных массива, поэтому вы не можете указать только один.
Во-первых, ваши индексы я и j меняются местами в ваших циклах. Убедитесь, что они используются для индексации в соответствующие массивы.
Во-вторых, вы выполняете код, который сравнивает элементы subarrays element-wise, это вернет массив логических значений, который является массивом, а не булевым, поэтому вы должны добавить.all(), чтобы свести его к одному булевому. .all() будет истинным, если все элементы верны, иначе это будет false.
В-третьих, вы должны иметь возможность уменьшить его. Я привел код ниже, чтобы показать все три из этих пунктов.
Кроме того, ваша новая строка не делает то, что должно быть. Убедитесь, что вы проверили свой код перед его публикацией и включили такие сведения, как версия используемого python.
import numpy as np
Large_arr=np.array([[0.12046862, 0.64457892],
[0.47522597, 0.12350968],
[0.1649585 , 0.50135502],
[0.20104755 ,0.15218623],
[0.03772419 ,0.42482297],
[0.51633778 ,0.61209002],
[0.24848648 ,0.99651906],
[0.47374345, 0.09990318],
[0.58390815 ,0.19781604],
[0.9613725 ,0.45975827],
[0.99008266 ,0.13487207],
[0.14410988 ,0.36196475],
[0.81349573 ,0.55896232],
[0.72841399 ,0.02263056],
[0.8692731 ,0.9754183 ],
[0.87142787 ,0.66163271],
[0.24342035 ,0.95821073],
[0.94218857 ,0.7220602 ],
[0.66716105 ,0.96875209]])
sub_arr=np.array([[0.12046862, 0.64457892],
[0.51633778 ,0.61209002],
[0.99008266 ,0.13487207],
[0.72841399 ,0.02263056],
[0.24342035 ,0.95821073],
[0.47374345, 0.09990318],
[0.9613725 ,0.45975827]])
s=[]
for i in range(0,len(Large_arr)):
for j in range(0,len(sub_arr)):
if((sub_arr[j]==Large_arr[i]).all()):
s.append(i)
print("Value of s is\n",s)
else:
#print("Value is none\n")
pass
opt = np.isin(Large_arr,sub_arr)
print
print "Bool array"
print opt
print
print "indexes"
print np.where(opt[:,0])[0]