【问题标题】:Create new array while Iterating over a n dimensional numpy array在迭代 n 维 numpy 数组时创建新数组
【发布时间】:2017-10-18 20:06:01
【问题描述】:

如何遍历 n 维的 numpy 数组并创建一个形状相似的新数组。

例如对于输入:

import numpy as np

arr = np.array([[1,2,3],
                [4,5,6],
                [7,8,9],
                [0,0,0]])
alpha = 3.
median = np.median(arr)

我想构建一个相同 (4,3) 的新数组,并将标志设置为 1 用于随机条件。 例如

flag = (arr[i,j] > median - alpha) or (arr[i,j] < median + alpha)

我会用 2 个 for 语句解决这个问题

flags = arr * 0 
for i in range(arr.shape[0]):
    for j in range(arr.shape[1]):
         flags[i,j] = (arr[i,j] > median - alpha) or (arr[i,j] < median + alpha)

有没有办法以更简单、更有效的 pythonic 方式解决这个问题?理想情况下,该解决方案也适用于 n 维数组(1,2,... n 维)

【问题讨论】:

  • 嗯,现在你正在生成True 标志,除非arr[i,j] == median * alpha。这就是你想要的吗?
  • 没错,这只是一个例子。我要问的是迭代过程。我将更新条件以使其更有意义

标签: python arrays numpy


【解决方案1】:

您根本不需要迭代。

np.logical_or(arr < median - alpha, arr > median + alpha)

【讨论】:

    【解决方案2】:

    Numpy 是为了避免循环:

    alpha = 3.
    median = np.median(arr)
    
    abs(arr-median) < alpha
    
    #array([[ True,  True,  True],
    #      [ True,  True,  True],
    #      [False, False, False],
    #      [False, False, False]], dtype=bool)
    

    当然,它适用于任意数量的维度。

    更一般地说,每次使用numpy logic functions 制定条件时,您都可以避免循环。 Python andor 运算符不映射到 numpy 数组,使用它们意味着循环和减速。

    【讨论】:

    • 当然,但您的答案是“使用”我设置的特定条件。在某些情况下,尽管这种情况可能非常复杂(甚至更糟可能根本不是一个条件),所以我想知道是否有更通用的解决方案来避免这种循环。
    猜你喜欢
    • 2013-04-03
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2014-08-29
    • 2012-11-06
    • 2021-12-04
    相关资源
    最近更新 更多