Python 从函数创建矩阵

Python 从函数创建矩阵,python,python-3.x,numpy,matrix,vectorization,Python,Python 3.x,Numpy,Matrix,Vectorization,我想从一个函数创建一个矩阵,如果行索引小于给定的阈值k,那么3,3矩阵C的值等于1 import numpy as np k = 3 C = np.fromfunction(lambda i,j: 1 if i < k else 0, (3,3)) 但是,这段代码会抛出一个错误 包含多个元素的数组的真值不明确。 使用a.any或a.all,我真的不明白为什么 根据@MarkSetchell的建议,您需要执行以下功能: k = 3 f = lambda i,j: 1 if i <

我想从一个函数创建一个矩阵,如果行索引小于给定的阈值k,那么3,3矩阵C的值等于1

import numpy as np

k = 3
C = np.fromfunction(lambda i,j: 1 if i < k else 0, (3,3))
但是,这段代码会抛出一个错误

包含多个元素的数组的真值不明确。 使用a.any或a.all,我真的不明白为什么


根据@MarkSetchell的建议,您需要执行以下功能:

k = 3
f = lambda i,j: 1 if i < k else 0

C = np.fromfunction(np.vectorize(f), (3,3))
问题是np.from函数不会迭代所有元素,它只返回每个维度中的索引。您可以使用np.where根据这些索引应用条件,根据条件从两个备选方案中进行选择:

import numpy as np

k = 3
np.fromfunction(lambda i, j: np.where(i < k, 1, 0), (5,3))
这避免了命名lambda而不会使事情变得太麻烦。在我的笔记本电脑上,这种方法比np.vectorize快20倍左右。

fromfunction的代码是:

您可以看到,它只调用一次函数——使用整个索引数组。它不是迭代的

In [672]: idx = np.indices((3,3))                                                    
In [673]: idx                                                                        
Out[673]: 
array([[[0, 0, 0],
        [1, 1, 1],
        [2, 2, 2]],

       [[0, 1, 2],
        [0, 1, 2],
        [0, 1, 2]]])
您的lambda需要标量i,j值,而不是三维数组

 lambda i,j: 1 if i < k else 0
然而,它并不比更直接的迭代方法快,也比在整个阵列上运行的函数慢

许多全阵列方法之一:

In [680]: np.where(np.arange(3)[:,None]<2, np.ones((3,3),int), np.zeros((3,3),int))  
Out[680]: 
array([[1, 1, 1],
       [1, 1, 1],
       [0, 0, 0]])

创建一个零数组c=np.zeros3,3,然后c[:k,:]=1?这会起作用,但我对这个错误的性质很感兴趣。嗯?当然,l=lambda i,j:1,如果iIn [672]: idx = np.indices((3,3)) In [673]: idx Out[673]: array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])
 lambda i,j: 1 if i < k else 0
In [677]: np.vectorize(lambda i,j: 1 if i < 2 else 0)(idx[0],idx[1])                 
Out[677]: 
array([[1, 1, 1],
       [1, 1, 1],
       [0, 0, 0]])
In [680]: np.where(np.arange(3)[:,None]<2, np.ones((3,3),int), np.zeros((3,3),int))  
Out[680]: 
array([[1, 1, 1],
       [1, 1, 1],
       [0, 0, 0]])