【问题标题】:How to retrieve values from 3d numpy array using multiple conditions如何使用多个条件从 3d numpy 数组中检索值
【发布时间】:2021-04-22 03:26:46
【问题描述】:

我有一个具有这种形状的特征表(3d numpy 数组):

characteristics = np.array((140, 401,9))

并有一个包含 140 个元素的最终一维数组:

final_array = np.array(140)

现在,我需要使用 3 个条件来检索特征并将它们添加到 final_array。

1- 将添加特征表中第一个维度中的哪些元素。示例:

which_elements = [True True False ... False True] # (140 elements)

所以现在我们知道我们只会使用第一个、第二个和最后一个元素的特性来添加到最终数组中。

2- 特征数组中的每个元素都是一个 (401x9) 表,我们需要通过匹配其行和列来检索单个值。 示例:

rows = [56 78 0 ... 0 43] # (140 elements) 

意味着对于第一个元素,我们检索第 56 行,第二个元素第 78 行,第三个元素不会被使用...最后一个元素第 43 行。

columns = [8 7 0 ... 0 4]# (140 elements) 

表示对于第一个元素,我们检索第 8 列,第二个元素第 7 列,第三个元素不会被使用...最后一个元素第 4 列。

检索到正确的值,我会将它们添加到 final_array 中。

我知道如何进行这种迭代,逐个元素地在特征表中搜索,但我需要它是一个快速操作,因为它每秒会完成超过一百万次,我很难做到这一点numpy 中的布尔索引。有什么建议吗?

编辑 - 尝试 TOMÁS VALLOTTON 答案:

import numpy as np

characteristics = np.array([[[500, 480], [480, 460]], [[460, 440], [440, 420]], [[420, 400], [400, 380]]])
print(characteristics)

final_array = np.zeros(3)

which = np.array([True, False, True])

rows = [0, 0, 1]
columns = [1, 0, 0]

expected_final_array = [480., 0., 400.]

# Tomás Valloton
array = np.where(which, characteristics[:, rows, columns], np.inf)
print(array[array != np.inf])

Output:
[480. 480. 440. 440. 400. 400.]

【问题讨论】:

    标签: python arrays numpy multidimensional-array conditional-statements


    【解决方案1】:

    也许这样的事情可以帮助你?

    array = np.where(which_elements, characteristics[:, row, columns], np.inf)
    array[array != np.inf]
    
    

    编辑:

    我猜你不想要 False 元素。这个怎么样?

    array = np.where(which_elements, characteristics[:, row, columns], 0)
    
    

    【讨论】:

    • 嗨,Tomás,我尝试了一个您的答案示例,看起来非常接近。似乎结果是重复的,中间元素也应该是 0,sinze 设置为 False。将在问题中发布代码。
    • 在第二次尝试中,输出是一个 3x3 数组。 [[480 0 480] [440 0 440] [400 0 400]]。如果我将以下内容应用于您的代码:array = array[:, 0]*[which][0],它将返回预期的结果。即使它得到了答案,你能否将它合并到你的代码中,缩短,以获得一维预期数组?顺便说一句,谢谢你的帮助。
    猜你喜欢
    • 2022-01-23
    • 2021-12-14
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多