【问题标题】:Create array based on boolean logic基于布尔逻辑创建数组
【发布时间】:2018-01-31 23:23:33
【问题描述】:

问题 1

我有一个 numpy 数组

data[:,0:5]
Out[98]: 
array([[  1.00200300e+09,   1.00000000e+00,   2.00000000e+00,
          3.00000000e+00,   4.00000000e+00],
       [  1.00200400e+09,   1.00000000e+00,   2.00000000e+00,
          4.00000000e+00,   5.00000000e+00],
       [  1.00200300e+09,   3.00000000e+00,   4.00000000e+00,
          1.00000000e+00,   2.00000000e+00],
       [  1.00200400e+09,   4.00000000e+00,   5.00000000e+00,
          1.00000000e+00,   2.00000000e+00],
       [  5.70580591e+10,   5.70000000e+01,   5.80000000e+01,
          5.90000000e+01,   6.00000000e+01],
       [  5.70580601e+10,   5.70000000e+01,   5.80000000e+01,
          6.00000000e+01,   6.10000000e+01],
       [  5.70580591e+10,   5.90000000e+01,   6.00000000e+01,
          5.70000000e+01,   5.80000000e+01],
       [  5.70580601e+10,   6.00000000e+01,   6.10000000e+01,
          5.80000000e+01,   5.70000000e+01]])

data[:,1:5] 中的每一个都是指二维网格上的一个位置,总共有 64 个位置。我正在尝试定义一个函数来给出每个位置的 x 位置。

我想要的是有一种情况

0 < i <= 8 returns 0.00
8 < i <= 16  returns 0.01
16 < i <= 24 returns 0.02
24 < i <= 32 returns 0.03
32 < i <= 40 returns 0.04
40 < i <= 48 returns 0.05
48 < i <= 56 returns 0.06
56 < i <= 64 returns 0.07

并且我希望将这些返回的值放入一个数组中,以便以后可以在 np.hstack 中使用数据。

我正在测试它

data[:,1]
Out[103]: array([  1.,   1.,   3.,   4.,  57.,  57.,  59.,  60.])

所以对于这个数组,它应该产生数组:

[[0.0, 0.0, 0.0, 0.0, 0.07, 0.07, 0.07, 0.07]]

我试过了:

pos = np.empty([len(data),])
def xpos(col):
    for i in col:
        if i <= 8:
            np.append(pos, [0.0])
        if 8 < i <= 16:
            np.append(pos, [1.0e-02])
        if 16 < i <= 24:
            np.append(pos, [2.0e-02])
        if 24 < i <= 32:
            np.append(pos, [3.0e-02])
        if 32 < i <= 40:
            np.append(pos, [4.0e-02])
        if 40 < i <= 48:
            np.append(pos, [5.0e-02])
        if 48 < i <= 56:
            np.append(pos, [6.0e-02])
        else:
            np.append(pos, [7.0e-02])
        return pos

xcol1 = xpos(data[:,1])

这给出了:

xcol1
Out[104]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

它不会产生我在新数组中追求的值。有谁知道我做错了什么?

编辑:

问题 2

次要问题是 y 位置问题,它不能很好地适合顺序 bin。

i == 1 or 9 or 17 or 25 or 33 or 41 or 49 or 57 returns 0.00
i == 2 or 10 or 18 or 26 or 34 or 42 or 50 or 58 returns 0.01
i == 3 or 11 or 19 or 27 or 35 or 43 or 51 or 59 returns 0.02
i == 4 or 12 or 20 or 28 or 36 or 44 or 52 or 60 returns 0.03
i == 5 or 13 or 21 or 29 or 37 or 45 or 53 or 61 returns 0.04
i == 6 or 14 or 22 or 30 or 38 or 46 or 54 or 62 returns 0.05
i == 7 or 15 or 23 or 31 or 39 or 47 or 55 or 63 returns 0.06
i == 8 or 16 or 24 or 32 or 40 or 48 or 56 or 64 returns 0.07

所以

data[:,1]
Out[103]: array([  1.,   1.,   3.,   4.,  57.,  57.,  59.,  60.])

在这种情况下应该返回

[[0.0, 0.0, 0.02, 0.03, 0.0, 0.0, 0.02, 0.03]]

我希望这样做:

pos = np.empty([len(data),])
def ypos(col):
    for i in col:
        if i == 1 or i == 9 or i == 17 or i == 25 or i == 33 or i == 41 or i == 49 or i == 57:
            np.append(pos, [0.0])
        if i == 2 or i == 10 or i == 18 or i == 26 or i == 34 or i == 42 or i == 50 or i == 58:
            np.append(pos, [1.0e-02])
        if i == 3 or i == 11 or i == 19 or i == 27 or i == 35 or i == 43 or i == 51 or i == 59:
            np.append(pos, [2.0e-02])
        if i == 4 or i == 12 or i == 20 or i == 28 or i == 36 or i == 44 or i == 52 or i == 60:
            np.append(pos, [3.0e-02])
        if i == 5 or i == 13 or i == 21 or i == 29 or i == 37 or i == 45 or i == 53 or i == 61:
            np.append(pos, [4.0e-02])
        if i == 6 or i == 14 or i == 22 or i == 30 or i == 38 or i == 46 or i == 54 or i == 62:
            np.append(pos, [5.0e-02])
        if i == 7 or i == 15 or i == 23 or i == 31 or i == 39 or i == 47 or i == 55 or i == 63:
            np.append(pos, [6.0e-02])
        else:
            np.append(pos, [7.0e-02])
        return pos

ya = ypos(data[:,1])

但这又会返回一个零数组

ya
Out[119]: array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])

【问题讨论】:

    标签: python python-3.x numpy append


    【解决方案1】:

    方法#1:您可以使用np.digitize -

    bins = np.arange(8,64,8)
    out = np.digitize(a, bins, right=True)*0.01
    

    示例运行 -

    案例#1:

    In [150]: a = np.array([  1.,   1.,   3.,   4.,  57.,  57.,  59.,  60.])
    
    In [151]: bins = np.arange(8,64,8)
    
    In [152]: np.digitize(a, bins, right=True)*0.01
    Out[152]: array([ 0.  ,  0.  ,  0.  ,  0.  ,  0.07,  0.07,  0.07,  0.07])
    

    案例#2:

    In [156]: a
    Out[156]: array([ -5.,   1.,   3.,   4.,  56.,  57.,  59.,  65.])
    
    In [157]: np.digitize(a, bins, right=True)*0.01
    Out[157]: array([ 0.  ,  0.  ,  0.  ,  0.  ,  0.06,  0.07,  0.07,  0.07])
    

    方法 #2: 或者,使用 np.searchsorted -

    np.searchsorted(bins, a)*0.01
    

    【讨论】:

    • 效果很好,谢谢 Divakar。我现在遇到的一个问题是,我看不到如何让它适用于 y 位置,这比合并的解决方案要复杂一些 - 我将编辑问题以显示 y 位置问题跨度>
    • 案例 #2 不太有效。我再次编辑了问题以更明确
    • @georussell 我有点困惑。您的问题 2 似乎无法通过您尝试使用 IF-ELSE 代码来解决。所以,这是一个新问题,对吧?
    • 基本上是这样——这都是为 8*8 2D 网格中的每个点获取 x 和 y 坐标的一部分,但它们看起来需要完全不同的方法,就像我一样希望完成它不起作用。我再次对其进行了更改以显示我要编写的代码。
    • @georussell 对于第二个问题,您可以简单地使用modulus : ((a%8)-1)*0.01a 是输入数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多