【问题标题】:creating a new array from a big array using a small array to select values numpy使用小数组从大数组创建一个新数组以选择值 numpy
【发布时间】:2021-01-23 12:30:27
【问题描述】:

我有两个 numpy 数组 - 一个 6000x4 的大数组和一个 10x1 的小数组。

big_array = array[[1,0.2,0.3,0.4],
                  [1,10.0,20.0,30.0],
                  [2,7.0,0.4,0.8]
                  [2,3,4,5]
                  ...
                  [150,56,57,89]
                  [150,78,27,64]]
small_array = array([17, 12,  5, 12, 18, 11,  1,  4,  3,  9])

我想使用小数组中的值创建一个新数组以从大数组中选择值。我可以通过在以下行中输入单个值来实现这一点:

new_array_0 = big_array[big_array[:,0]] == small_array[0]
new_array_1 = big_array[big_array[:,0]] == small_array[1]

我尝试在 for 循环中运行它:

subSet = np.empty((0,4))
for i in small_array:
    a = big_array[big_array[:,0]] == small_array[i]
    subSet = np.append(subSet,a,axis=0)

但这会导致错误。 有没有 python/numpy 方法来实现这一点?

【问题讨论】:

  • 您能否添加一个完整的示例:big_arraysmall_array 和预期输出?
  • 我认为出现错误是因为 subSet 和 a 具有不同的形状。不知道如何解决它,除非可能使子集形状 ((,4)) 而不是 ((0, 4))
  • 错误是什么?不要只是说有错误并期望我们猜测。自己做一些调试工作!

标签: arrays python-3.x numpy


【解决方案1】:

我从您的帖子中提取了一个小样本:

>>> big_array = np.array([[ 1,  0,  0,  0],
                          [ 1, 10, 20, 30],
                          [ 2,  7,  0,  0],
                          [ 2,  3,  4,  5],
                          [ 2, 56, 57, 89],
                          [ 1, 78, 27, 64]])

>>> small_array = torch.array([20, 10, 30])

在我看来,您有一个二维数组big_array[big_array[:,0]],您想将其与small_array 中包含的标量值进行比较。将数组与单个标量进行比较将返回一个形状相同的数组,其中条件将被逐个调用,为您留下一个布尔掩码:

>>> big_array[big_array[:,0]] == small_array[0]
array([[False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]])

当然,如果您直接与small_array 进行比较,它会检查数组到数组,这将返回False,甚至会发出DeprecationWarning 警告:

>>> big_array[big_array[:,0]] == small_array
False

不过,您可以做的是广播您的small_array

>>> small_array[:, None, None].shape
(10, 1, 1)

这样您可以将索引数组与small_array 的标量值进行比较:

>>> big_array[big_array[:,0]] == small_array[:, None, None]
array([[[False, False,  True, False],
        [False, False,  True, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False,  True, False]],

       [[False,  True, False, False],
        [False,  True, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False,  True, False, False]],

       [[False, False, False,  True],
        [False, False, False,  True],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False,  True]]])

这与big_array[big_array[:,0]] == small_array[0]big_array[big_array[:,0]] == small_array[1]big_array[big_array[:,0]] == small_array[2] 产生的结果相同。

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2020-10-10
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2017-03-17
    • 2021-08-15
    相关资源
    最近更新 更多