【问题标题】:Create array based on conditional logic of values in other arrays in Python基于Python中其他数组中值的条件逻辑创建数组
【发布时间】:2017-02-04 18:57:23
【问题描述】:

我有一个 np 数组(系列?),数字范围从 1 到 100,我有第二个数组,其中包含一些随机数。两个数组的长度相同。我想创建一个第三个数组,如果 array2[i] > array1[i] 则为 1,如果 array2[i] = array1[i] 则为 0,如果 array2[i]

我可以使用 for 循环和一些“if”语句轻松完成此操作,但处理时间超出了我的承受能力。

请原谅我写这篇文章的方式,我对 python 还很陌生,并且在 stackoverflow 中提问。非常感谢您的帮助。

array1 = [1,2,3,4,5,6,7,8,9,10]
array2 = [5,8,2,4,9,3,0,2,8,5]
array3 = [1,1,-1,0,1,-1,-1,-1,-1,-1]

【问题讨论】:

  • 能否为这两个数组添加一个示例?
  • array1 = [1,2,3,4,5,6,7,8,9,10], array2 = [5,8,2,4,9,3,0,2 ,8,5],array3 应该是这样的 = [1,1,-1,0,1,-1,-1,-1,-1,-1]

标签: python arrays numpy


【解决方案1】:

这似乎是np.sign 的一个很好的用例,它将正数转换为 1,零转换为 0,负数转换为 -1:

>>> array1 = np.array([1,2,3,4,5,6,7,8,9,10])
>>> array2 = np.array([5,8,2,4,9,3,0,2,8,5])
>>> np.sign(array2-array1)
array([ 1,  1, -1,  0,  1, -1, -1, -1, -1, -1])

【讨论】:

  • TIL np.sign 是一个东西。这是迄今为止最好的答案。
  • 我们有一个赢家。 :)
  • 我想它可能就这么简单,谢谢你的帮助。
  • 与 Christoph Terasa 的答案相比,我刚刚尝试过这个答案,这条路线仅供参考。
  • 很奇怪,根据我使用 ipython 的 %timeit 魔法的测试,这个解决方案是最快的。
【解决方案2】:
import numpy as np

a = np.array([1,2,3,4,5,6,7,8,9,10])
b = np.array([5,8,2,4,9,3,0,2,8,5])

r = 1*(b > a) - (b < a) # multiplying by one converts boolean array to int array
print(r) # [ 1  1 -1  0  1 -1 -1 -1 -1 -1]

【讨论】:

  • 哦,这很聪明。
  • 太棒了,看起来应该可以解决问题,非常感谢您的快速回复!
  • @Mitch,我更喜欢你的解决方案。
  • @ChristophTerasa 请参阅 DSM 的回答 - 这是我的改进版本。
【解决方案3】:

你也可以使用掩码:

array1 = [1,2,3,4,5,6,7,8,9,10]
array2 = [5,8,2,4,9,3,0,2,8,5]

result = np.zeros(10)
# use masks
result[array2>array1 ] = 1
result[array2 ==array1 ] = 0
result[array2<array1 ] = -1

print(result) # [1,1,-1,0,1,-1,-1,-1,-1,-1]

【讨论】:

    【解决方案4】:

    也许有一种更快的方法,但一种选择是从第二个数组中减去第一个数组,然后 numpy.clip 将差异作为比较标准。

    >>> arr1 = np.array([1, 5, -3, 2, 7])
    >>> arr2 = np.array([-4, 5, 3, 0, 7])
    >>> np.clip(arr2-arr1, -1, 1)
    array([-1,  0,  1, -1,  0])
    

    编辑:由于np.signsee DSM's answer,不需要剪辑。

    【讨论】:

    • 这比我的解决方案快 30% 左右。
    猜你喜欢
    • 2018-01-31
    • 2023-01-17
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多