【问题标题】:How can I use numpy create list out of another list with modified elements如何使用 numpy create list 从另一个列表中修改元素
【发布时间】:2018-03-04 00:16:46
【问题描述】:

我对 Python 编程一点也不陌生,但我对 Numpy 模块完全陌生。我需要使用这个模块,因为它非常快速和高效。

假设我有一个名为noise 的数组,其定义如下:

noise = [[uniform(0, 1) for i in range(size)] for j in range(size)]

在 numpy 术语中,我相信它是这样定义的:

noise = np.uniform(0, 1, (size, size))

现在说我想生成一个新数组,它采用噪声数组并用函数function(i, j) 替换其元素中的每个元素noise[i][j] 使用 python 的内置列表理解,我会简单地说:

modified_noise = [[function(i, j) for i in range(size)] for j in range(size)]

我的问题是:如何使用 numpy 模块来做到这一点。

【问题讨论】:

  • 使用列表理解有什么问题?看起来function 只适用于标量输入,对吧?没有办法为每个 size*size (i,j) 对评估一次,是吗?
  • 我看不出modified_noisenoise 有什么关系。 function 只接受坐标作为参数,而不是 noise
  • 顺便说一句,没有np.uniform.. noise = np.random.random_sample((size, size)) 是正确的表达方式。您似乎也对“替换每个元素”的概念感到困惑。
  • 哦,是的,有一个numpy.uniform。我使用了它,它实际上按预期工作。
  • 另外,modified_noise 将从noise 构造。这两者是相关的,但仅在函数function 的定义内,在我的例子中是一个湍流函数(我称它为函数是为了给你一个更抽象的代码版本)

标签: python arrays performance numpy list-comprehension


【解决方案1】:

您可以为此使用np.fromfunction

modified_noise = np.fromfunction(lambda i, j: function(i, j), (size, size), dtype=float)

这通过在每个坐标上执行一个函数来构造一个数组。

相关:How can I use a range inside numpy.fromfunction?

【讨论】:

【解决方案2】:

您可以直接从列表列表中构建一个 numpy 数组,例如:

代码:

np.array(modified_noise)

测试代码:

data = [[i * j for j in range(5)] for i in range(5)]
print(data)

import numpy as np
print(np.array(data))

结果:

[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12], [0, 4, 8, 12, 16]]

[[ 0  0  0  0  0]
 [ 0  1  2  3  4]
 [ 0  2  4  6  8]
 [ 0  3  6  9 12]
 [ 0  4  8 12 16]]

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多