【问题标题】:How do I use a for loop to create a new 2D numpy array?如何使用 for 循环创建一个新的 2D numpy 数组?
【发布时间】:2019-08-11 05:29:54
【问题描述】:

我之前问过一个类似的问题,但措辞很糟糕。我想出了一些东西,但还没有成功。我试图通过调用以前的函数来创建一个新的二维数组。我希望 function_2 执行与 function_1 相同的计算,但在 function_2 中它涉及数组而不是单个值。

这就是我所拥有的:

import numpy as np 

def function_1(A,B):
    A = 10
    B = 2
    ans = A*B
    return ans


def function_2(C,D):

    C = np.array([1,2,3,4,5])
    D = np.array([1,2,3,4,5])

    #here I create a zero array and include some other codes required

    for i in range(C): #each i are A values
        for j in range(D): #each j are B values
            array[i,j] = function_1(C,D)

    return array
print(array)

上面的例子给了我这个:

[[25. 25. 25. 25. 25.]
 [25. 25. 25. 25. 25.]
 [25. 25. 25. 25. 25.]
 [25. 25. 25. 25. 25.]
 [25. 25. 25. 25. 25.]]

但我希望它对 C 和 D 的每个值进行计算并给我这样的东西:

[[1. 2. 3. 4. 5.]
 [2. 4. 6. 8. 10.]
 [3. 6. 9. 12. 15.]
 [4. 8. 12. 16. 20.]
 [5. 10. 15. 20. 25.]]

谢谢

【问题讨论】:

  • C[:, None] * D
  • 如果function_1比较复杂,每对元素需要很长时间,你可以使用np.vectorize

标签: python-3.x numpy


【解决方案1】:

您的代码中有几个错误。让我们弄清楚。

  1. 您在函数开头使用默认值覆盖输入值:
def function_1(A, B):
    -> A = 10
    -> B = 2
    ...

将传递给函数的参数是 const 无关紧要。但我不明白为什么在你的例子中是25 而不是20

  1. 您不能将range 函数与数组一起使用。请查看the reference的功能。
for i in range(C): #here
    for j in range(D): #here
        array[i, j] = function_1(C,D)
  1. 您将数组传递给function_1
 -> function_1(C, D)

我不明白您是如何获得带有这些错误的 25. 数组的。但固定的解决方案应该是:

import numpy as np


def function_1(A, B):
    ans = A * B
    return ans


def function_2(C, D):
    a = np.zeros((len(C), len(D)), dtype=int) # because you have to allocate matrix before use
    for idi, i in enumerate(C):
        for idj, j in enumerate(D):
            a[idi][idj] = function_1(i, j)

    return a


C = np.array([1, 2, 3, 4, 5])
D = np.array([1, 2, 3, 4, 5])
array = function_2(C, D)
print(array)

没有功能的更好的解决方案

import numpy as np

C = np.array([1, 2, 3, 4, 5])
D = np.array([1, 2, 3, 4, 5])

diag = np.diag(D)
rows = np.array([C, ] * 5)

print(np.dot(diag, rows))

两种解决方案产品:

[[ 1  2  3  4  5]
 [ 2  4  6  8 10]
 [ 3  6  9 12 15]
 [ 4  8 12 16 20]
 [ 5 10 15 20 25]]

【讨论】:

  • a[i, j] 是首选的 numpy 索引样式。
  • @hpaulj 已删除
【解决方案2】:

试试这个。

ans = []
for i in range(1,6):
    a =[]
    for j in range(1,6):
        a.append(i*j)

    ans.append(a)

ans = np.array(ans)
ans

使用 np.zeros

ans = np.zeros((5,5),dtype=np.int)
for i in range(1,6):
    for j in range(1,6):
        ans[i-1][j-1]=i*j
ans

【讨论】:

  • 谢谢。有没有办法通过首先创建一个零数组并调用上一个函数来做到这一点?这就是我需要做的,因为函数比这个例子更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多