0

我正在尝试学习如何在 python 中使用 Numpy 数组,并致力于一项任务,其目标是将某些值从 square 函数附加到 np 数组。

具体来说,尝试以结果看起来像这样的方式附加到数组。

[[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25](....)

换句话说,有点像使用 for 循环附加到嵌套列表,如下所示:

N = 101

def f(x):
    return x**2

list1 = []
for i in range(N+1):
    list1.append([i])
    list1[i].append(f(i))

print(list1)

当我尝试使用类似下面的 Numpy 数组来执行此操作时:

import numpy as np

N = 101
x_min = 1
x_max = 10

y = np.zeros(N)
x = np.linspace(x_min,x_max, N)

def f(x):
    return x**2

for i in y:
    np.append(y,f(x))
print(y)

我得到以下输出:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0.]

...这显然是错误的

数组作为一种数据类型对我来说很新,所以如果有人能帮助我,我将不胜感激。

来自有动力学习并欢迎所有帮助的新秀的问候。

4

3 回答 3

3

将 numpy 数组与普通的 python 操作(如 for 循环和附加)混合和匹配是一种非 numpy-thonic(如果这是一件事)。如果我要在纯 numpy 中执行此操作,我将首先从您的原始数组开始

>>> import numpy as np
>>> N = 101
>>> values = np.arange(N)
>>> values
array([  0,   1,   2,   ...,  99, 100])

然后我会生成你的平方数组来创建你的 2D 结果

>>> values = np.array([values, values**2])
>>> values.T
array([[    0,     0],
       [    1,     1],
       [    2,     4],
       ...
       [   98,  9604],
       [   99,  9801],
       [  100, 10000]])
于 2021-09-27T17:35:12.987 回答
1

Numpy 通过两种主要方式获得速度优势:

  1. 更快地执行大量重复操作(即没有 Python for 循环)

  2. 避免在内存中移动数据(即重新分配内存空间)。

使用 Numpy 数组实现无限期追加操作并仍然获得这两个优点是不可能的。所以不要这样做!

我在您的示例中看不到为什么需要追加,因为您提前知道结果数组的大小(N)。

也许您正在寻找的是矢量化函数执行和分配:

y[:] = f(x)
print(y)

(而不是你的 for 循环。)

这会产生:

[  1.       1.1881   1.3924   1.6129   1.8496   2.1025   2.3716   2.6569
   2.9584   3.2761   3.61     3.9601   4.3264   4.7089   5.1076   5.5225
   5.9536   6.4009   6.8644   7.3441   7.84     8.3521   8.8804   9.4249
   9.9856  10.5625  11.1556  11.7649  12.3904  13.0321  13.69    14.3641
...etc.

或者,要获得与您的第一段代码类似的输出:

y = np.zeros((N, 2))
y[:, 0] = x
y[:, 1] = f(x)
于 2021-09-27T17:45:09.820 回答
1

您可以简单地广播操作和 column_stack 它们。

col1 = np.arange(N)
col2 = col1 **2
list1 = np.column_stack((col1,col2))
于 2021-09-27T17:36:39.703 回答