gpt4 book ai didi

python - numpy,取它们交集的数组差

转载 作者:太空宇宙 更新时间:2023-11-03 12:53:52 25 4
gpt4 key购买 nike

我有多个 numpy 数组,我想创建新的数组来做一些类似于 XOR 的事情......但不完全是。

我的输入是两个数组,array1 和 array2。我的输出是 array1 的修改版本(或新数组,我并不关心)。

修改是按元素进行的,通过执行以下操作:

1.) 如果任一数组的给定索引为 0,则索引保持不变。2.) 如果 array1 和 array2 不为零,则修改后的数组分配的值是 array1 的索引减去 array2 的索引,直到最小值零。

例子:

array1:  [0, 3, 8, 0]
array2: [1, 1, 1, 1]
output: [0, 2, 7, 0]


array1: [1, 1, 1, 1]
array2: [0, 3, 8, 0]
output: [1, 0, 0, 1]

array1: [10, 10, 10, 10]
array2: [8, 12, 8, 12]
output: [2, 0, 2, 0]

我希望能够用一个 numpy.copyto 语句来做到这一点,但我不知道该怎么做。谢谢。

编辑:

它刚刚击中了我。我能做吗:

new_array = np.zeros(size_of_array1)
numpy.copyto(new_array, array1-array2, where=array1>array2)

编辑 2:由于我很快收到了几个答案,所以我将对不同的答案进行计时,看看它们的效果如何。几分钟后返回结果。

好的,结果在:

0 到 5 的随机整数数组,大小 = 10,000,10 个循环

1.)使用我的 np.copyto 方法

2.)使用剪辑

3.)使用最大值

0.000768184661865
0.000391960144043
0.000403165817261

Kasramvd 还在下面提供了一些有用的时序

最佳答案

您可以使用一个简单的减法并将结果裁剪为零作为 min:

(arr1 - arr2).clip(min=0)

演示:

In [43]: arr1 = np.array([0,3,8,0]); arr2 = np.array([1,1,1,1])

In [44]: (arr1 - arr2).clip(min=0)
Out[44]: array([0, 2, 7, 0])

在大型阵列上,它也比最大 方法更快:

In [51]: arr1 = np.arange(10000); arr2 = np.arange(10000)

In [52]: %timeit np.maximum(0, arr1 - arr2)
22.3 µs ± 1.77 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [53]: %timeit (arr1 - arr2).clip(min=0)
20.9 µs ± 167 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [54]: arr1 = np.arange(100000); arr2 = np.arange(100000)

In [55]: %timeit np.maximum(0, arr1 - arr2)
671 µs ± 5.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [56]: %timeit (arr1 - arr2).clip(min=0)
648 µs ± 4.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

请注意,如果 arr2 可能有负值,您应该考虑在 arr2 上使用 abs 函数以获得预期结果:

(arr1 - abs(arr2)).clip(min=0)

关于python - numpy,取它们交集的数组差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51012084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com