【问题标题】:Numpy .in1d method not evaluating array vs array view correctly?Numpy .in1d 方法不能正确评估数组与数组视图?
【发布时间】:2021-03-07 22:43:39
【问题描述】:

我正在尝试搜索并查看一个 numpy 数组是否在另一个数组中以进行调试。

#Pattern
arr1 = np.array([1.62434536, -0.61175641, -0.52817175])
#type : np.ndarray
#dtype : 'float64'
#shape : (3,)

然后我有一个 tupleslist,其中每个 tuple 中的第一个元素是 n x m ndarray 假设这个对象被称为“my_nest”

arr2 = my_nest[0][0][0][0:3]
arr2
#array([ 1.62434536, -0.61175641, -0.52817175])
#type : np.ndarray
#dtype : 'float64'
#shape : (3,)

但随后使用 in1d 方法返回一个不直观的结果

np.in1d(arr1,arr2)
#array([False, False, False], dtype=bool)

我知道切片 ndarray 会创建对象在内存中的视图,但我什至尝试将 np.copy 包裹在它周围以在内存中创建一个新对象,然后进行比较,但我仍然得到 False。

有人知道这里发生了什么吗?

【问题讨论】:

  • arr1 == arr2 的结果是什么?
  • arr1-arr2。浮点数的相等性测试可能不可靠。
  • @hpaulj。排序似乎是相同的,据我所知,in1d 使用相等测试。当然,一般来说,减法会提供更多信息。

标签: python arrays numpy


【解决方案1】:

正如 cmets 中提到的,这是浮点精度的影响。您可以根据 source for small arrays 使用 isclose 而不是 == 重新实现 in1d

import numpy as np

arr1 = np.array([1.62434536, -0.61175641, -0.52817175])
arr2 = np.array([1.62434536, -0.61175641, -0.52817175+1e-12])
print(arr1)
print(arr2)

print('isin:   ', np.in1d(arr1,arr2))

mask = np.zeros(len(arr1), dtype=bool)
for a in arr2:
    mask |= np.isclose(arr1, a)
print('isclose:', mask)

输出:

[ 1.62434536 -0.61175641 -0.52817175]
[ 1.62434536 -0.61175641 -0.52817175]
isin:    [ True  True False]
isclose: [ True  True  True]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多