Numpy ufunc 'equal'未包含签名匹配类型的循环

ctehm74n  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(62)

我尝试使用np.equal()在numpy数组中搜索给定值的示例,例如:

a = ["192.168.0.1", "192.168.0.2", "192.168.0.3"]
b = "192.168.0.3"

a = np.array(a, dtype=str)
b = np.array(b, dtype=str)

result = np.equal(a,b)

字符串
但是当np.equal()a数组中搜索b时,我在标题中得到了错误。我在使用numpy 1.21.6的生产环境中测试脚本时遇到了这个错误,它不会在使用numpy 1.24.2的测试环境中发生。
除了更新生产服务器上的numpy(可能会破坏其他东西),我该如何解决这个问题?
完整错误:

numpy.core._exceptions.UFuncTypeError: ufunc 'equal' did not contain a loop with signature matching types (dtype('<U1'), dtype('<U1')) -> dtype('bool')


我已经尝试在数组定义中使用dtype=str强制两个数组的dtype。我也看过其他问题,但没有发现任何类似的东西。

r9f1avp5

r9f1avp51#

如果您对潜在的性能影响没有意见,那么下面的代码可以在1.21.6上运行:

import numpy as np
a = ["192.168.0.1", "192.168.0.2", "192.168.0.3"]
b = "192.168.0.3"

a = np.array(a)

result = a == b
print(result)

字符串
产量

[False False  True]


在更新版本的numpy中,我看到以下两条语句花费的时间大致相同,大约为0.29s,但在1.21.6中,第一条语句花费的时间大约为5.44s,因此如果您使用10k IP运行500次,可能会有关系。

a = [".".join(map(str,np.random.randint(256,size=4))) for _ in range(10000)]
print(timeit.timeit('sum(a == b)', globals=globals(), number=500))
print(timeit.timeit('sum(np.equal(a,b))', globals=globals(), number=500))

相关问题