Arrays 二维数组为循环赋值

Arrays 二维数组为循环赋值,arrays,numpy,Arrays,Numpy,我需要一些帮助。我有两个数组。比方说 alpha = np.arange(1,5,1) ==> [1,2,3,4] beta = np.arange(5,8,1) ==> [5,6,7] 如何使用alpha和beta值,调用函数,并将函数return分配到一个数组中,该数组的行数与beta中的元素数相同,列数与alpha中的元素数相同 matrix_assign = np.zeros_like((alpha, beta), dtype = 'float') +---+---+

我需要一些帮助。我有两个数组。比方说

alpha = np.arange(1,5,1) ==> [1,2,3,4] 
beta = np.arange(5,8,1) ==> [5,6,7] 
如何使用alpha和beta值,调用函数,并将函数return分配到一个数组中,该数组的行数与beta中的元素数相同,列数与alpha中的元素数相同

matrix_assign = np.zeros_like((alpha, beta), dtype = 'float')

+---+---+---+---+---+
|   | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
| 5 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
| 6 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
| 7 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+
我的函数有点复杂,因此为此,让我们让函数

np.sqrt((alpha-beta)^2)
这是我到目前为止的代码,但它似乎不起作用。基本上,alpha中的i和beta中的j进入函数,返回的值将替换其各自单元格中的零

 for i in range(alpha):
        for j in range(beta):
            matrix_assign[i,j] = fn.sample_function(i,j)
例如,当
alpha[0]
beta[1]
进入函数时,输出5被分配给单元格
matrix\u assign[1,0]

多谢各位

编辑:

为什么上面的代码不起作用?我发现了错误

for i in range(alpha):
    TypeError: only integer scalar arrays can be converted to a scalar index
matrix_assign[i,j] = np.sqrt((alpha-beta)^2) 
    ValueError: operands could not be broadcast together with shapes (4,) (3,)
    
使用
范围(len(alpha))
也不起作用。我得到了错误

for i in range(alpha):
    TypeError: only integer scalar arrays can be converted to a scalar index
matrix_assign[i,j] = np.sqrt((alpha-beta)^2) 
    ValueError: operands could not be broadcast together with shapes (4,) (3,)
    
一般来说,这是一个操作。不幸的是,它只适用于。减法是一种
ufunc
,但不是操作的其余部分。您可以这样做:

matrix_assign = np.abs(np.subtract.outer(alpha, beta))
但是,一般来说,您需要确保您的
fn.sample_函数
是由
ufunc
组成的,或者是调整为(作为a或a),您的代码应该是:

import numpy as np

alpha = np.arange(1,5,1) #==> [1,2,3,4] 
beta = np.arange(5,8,1) #==> [5,6,7] 

matrix_assign = np.zeros_like((alpha, beta), dtype = 'float')

for i in range(alpha.size):
    for j in range(beta.size):
        matrix_assign[i,j] = fn.sample_function(alpha[i], beta[j])
fn.sample_函数需要单个值
alpha
beta
,而不是索引。 不过这很慢

如果
fn.sample\u函数
已矢量化,则可以执行以下操作:

A, B = np.meshgrid(alpha, beta)
matrix_assign = fn.sample_function(A, B)
您还可以使用
np.vectorize
将任何要伪向量化的函数混搭在一起

A, B = np.meshgrid(alpha, beta)
matrix_assign = np.vectorize(fn.sample_function)(A, B)

但这只是一个方便的函数,与循环相比,它没有任何时间优势。

Hello@Daniel F,谢谢你的回答。嗯,有没有办法让我的工作使用矩阵分配[i,j]=。。。。这就是我被教导给数组中的单元格赋值的方式。我到底做错了什么?谢谢。你可以把它矢量化。它不会比你的
for
循环快多少。但是除非
fn.sample\u函数的内部已经矢量化,否则没有一个简单的方法,不。我想你不想共享这个函数。嗯,我明白了。这个函数相当长。这段代码是更大代码的一小部分,它通过从不同文件调用函数来工作,因此有太多的内容需要共享。我只是想更好地理解为什么上面的代码不起作用。我知道我在正确的轨道上,但我觉得我遗漏了一些东西。
range
是一个python函数,它需要一个整数,而不是
numpy
数组。至于第二个错误,你需要
matrix\u assign[I,j]=np.sqrt((alpha[I]-beta[j])^2)
检查我更新答案的编辑。我明白了。谢谢你@Daniel F。这并不完全是我所期望的,但它仍然很有用。我发现我的问题是矩阵的大小。结果表明,它是一个1x2阵列,而不是3x4阵列。不知道为什么。