Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在考虑元素位置的情况下逐个比较numpy数组元素? 我想把两个麻木数组元素一个元素的位置考虑一下。比如说 [1, 2, 3]==[1, 2, 3] -> True [1, 2, 3]==[2, 1, 3] -> False_Python_Arrays_Numpy - Fatal编程技术网

Python 如何在考虑元素位置的情况下逐个比较numpy数组元素? 我想把两个麻木数组元素一个元素的位置考虑一下。比如说 [1, 2, 3]==[1, 2, 3] -> True [1, 2, 3]==[2, 1, 3] -> False

Python 如何在考虑元素位置的情况下逐个比较numpy数组元素? 我想把两个麻木数组元素一个元素的位置考虑一下。比如说 [1, 2, 3]==[1, 2, 3] -> True [1, 2, 3]==[2, 1, 3] -> False,python,arrays,numpy,Python,Arrays,Numpy,我尝试了以下方法 for index in range(list1.shape[0]): if list1[index] != list2[index]: return False return True 但是我犯了以下错误 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 但是,

我尝试了以下方法

    for index in range(list1.shape[0]):
        if list1[index] != list2[index]:
            return False
    return True
但是我犯了以下错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
但是,以下不是.any或.all的正确用法

 numpy.any(numpy.array([1,2,3]), numpy.array([1,2,3]))


 numpy.all(numpy.array([1,2,3]), numpy.array([1,2,3]))
当它回来的时候

 TypeError: only length-1 arrays can be converted to Python scalars
我很困惑,有人能解释一下我做错了什么吗


谢谢

您可以将布尔值数组传递给
all
,例如:

>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 1, 3])
>>> a == b
array([False, False,  True], dtype=bool)
>>> np.all(a==b) # also works with all for 1D arrays
False

请注意,内置的
all
np快得多。对于小型阵列,all
比np.array\u equal更慢:

但无法正确使用多维数组:

>>> a = np.arange(9).reshape(3, 3)
>>> b = a.copy()
>>> b[0, 0] = 42
>>> all(a==b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> np.all(a==b)
False
您还可以使用:


这应该更有效,因为您不需要保留临时的
a==b


注意:关于性能的一点,对于要使用
np.all
而不是
all
的较大阵列
array_equal
的性能大致相同,除非阵列在早期出现差异,否则它会更快,因为它可能在早期出现故障:

In [21]: a = np.arange(100000)

In [22]: b = np.arange(100000)

In [23]: c = np.arange(1, 100000)

In [24]: %timeit np.array_equal(a, a)  # Note: I expected this to check is first, it doesn't
10000 loops, best of 3: 183 µs per loop

In [25]: %timeit np.array_equal(a, b)
10000 loops, best of 3: 189 µs per loop

In [26]: %timeit np.array_equal(a, c)
100000 loops, best of 3: 5.9 µs per loop

In [27]: %timeit np.all(a == b)
10000 loops, best of 3: 184 µs per loop

In [28]: %timeit np.all(a == c)
10000 loops, best of 3: 40.7 µs per loop

In [29]: %timeit all(a == b)
100 loops, best of 3: 3.69 ms per loop

In [30]: %timeit all(a == c) # ahem!
# TypeError: 'bool' object is not iterable

您可能应该使用
np.all
,而不是内置的
all
。我认为两者之间存在很大的差异,但我在平板电脑上,因此无法测试。我猜内置的使用标准的迭代协议,而np使用C实现的快速循环。快速的
timeit
测试表明
all
快了一个数量级,这让我感到非常惊讶。@jornsharpe可能是针对小a和b的?@AndyHayden是的,
len(a)==len 3
,根据OP的例子。我已经用计时更新了答案。
numpy.all(numpy.array([1,2,3])==numpy.array([1,2,3])有什么问题?
>>> timeit.timeit("np.all(a==b)", setup="import numpy as np; a = np.arange(1000); b = a.copy(); b[999] = 0")
13.581198551000853
>>> timeit.timeit("all(a==b)", setup="import numpy as np; a = np.arange(1000); b = a.copy(); b[999] = 0")
30.610838356002205
>>> timeit.timeit("np.array_equal(a, b)", setup="import numpy as np; a = np.arange(1000); b = a.copy(); b[999] = 0")
17.95089965599982
In [11]: a = np.array([1, 2, 3])

In [12]: b = np.array([2, 1, 3])

In [13]: np.array_equal(a, a)
Out[13]: True

In [14]: np.array_equal(a, b)
Out[14]: False
In [21]: a = np.arange(100000)

In [22]: b = np.arange(100000)

In [23]: c = np.arange(1, 100000)

In [24]: %timeit np.array_equal(a, a)  # Note: I expected this to check is first, it doesn't
10000 loops, best of 3: 183 µs per loop

In [25]: %timeit np.array_equal(a, b)
10000 loops, best of 3: 189 µs per loop

In [26]: %timeit np.array_equal(a, c)
100000 loops, best of 3: 5.9 µs per loop

In [27]: %timeit np.all(a == b)
10000 loops, best of 3: 184 µs per loop

In [28]: %timeit np.all(a == c)
10000 loops, best of 3: 40.7 µs per loop

In [29]: %timeit all(a == b)
100 loops, best of 3: 3.69 ms per loop

In [30]: %timeit all(a == c) # ahem!
# TypeError: 'bool' object is not iterable