numpy,取其交集的数组差

时间:2018-06-24 16:58:52

标签: python arrays numpy multidimensional-array numpy-ndarray

我有多个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在下面还提供了一些有用的时间安排

3 个答案:

答案 0 :(得分:4)

In [73]: np.maximum(0,np.array([0,3,8,0])-np.array([1,1,1,1]))
Out[73]: array([0, 2, 7, 0])

这没有明确解决

  

如果任一数组的给定索引都为0,则索引保持不变。

但结果与所有示例均匹配:

In [74]: np.maximum(0,np.array([1,1,1,1])-np.array([0,3,8,0]))
Out[74]: array([1, 0, 0, 1])
In [75]: np.maximum(0,np.array([10,10,10,10])-np.array([8,12,8,12]))
Out[75]: array([2, 0, 2, 0])

答案 1 :(得分:4)

您可以使用简单的减法并将结果剪裁为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])

在大型数组上,它比maximum方法还快:

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可能具有负值,则应考虑在abs上使用arr2函数以获得预期结果:

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

答案 2 :(得分:0)

您可以首先简单地将数组相减,然后对相减后的结果使用boolean array indexing将0赋给负值,如:

# subtract
In [43]: subtracted = arr1 - arr2

# get a boolean mask by checking for < 0
# index into the array and assign 0
In [44]: subtracted[subtracted < 0] = 0

In [45]: subtracted
Out[45]: array([0, 2, 7, 0])

对OP指定的其他输入应用相同的操作:

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

In [47]: subtracted = arr1 - arr2
In [48]: subtracted[subtracted < 0] = 0

In [49]: subtracted
Out[49]: array([1, 0, 0, 1])

对于第三个输入数组:

In [50]: arr1 = np.array([10, 10, 10, 10])
    ...: arr2 = np.array([8, 12, 8, 12])

In [51]: subtracted = arr1 - arr2
In [52]: subtracted[subtracted < 0] = 0

In [53]: subtracted
Out[53]: array([2, 0, 2, 0])