使用nditer迭代两个numpy 2d矩阵

时间:2018-02-10 18:57:00

标签: python numpy matrix iterator

我试图迭代两个numpy矩阵,一个大小为nx3,另一个大小为nx1

我正试图让nditer同时迭代他们的行。

所以如果我们有:

y = np.array([   [ 1],
                 [-1],
                 [ 1]   ])
x = np.array([[ 1.3432504 , -1.3311479 ,  1.        ],
             [ 1.8205529 , -0.6346681 ,  1.         ],
             [ 0.98632067, -1.8885762 ,  1.         ]])

我试试:

for (a,b) in iterator:
   print(a)
   print(b)

这应该给予

[1]
[ 1.3432504 , -1.3311479 ,  1.        ]
[-1]
[ 1.8205529 , -0.6346681 ,  1.         ]
[1]
[ 0.98632067, -1.8885762 ,  1.         ]

我用'external_loop flag'尝试了np.nditer,我得到了x的所需输出,但是当我一次只想要一个时,它会强制y成为3个元素的束。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用zip()内置功能:

In [22]: for i, j in zip(y, x):
             print(i);print(j)
   ....:     
[1]
[ 1.3432504 -1.3311479  1.       ]
[-1]
[ 1.8205529 -0.6346681  1.       ]
[1]
[ 0.98632067 -1.8885762   1.        ]

答案 1 :(得分:1)

难以控制深度'与In [35]: for i,j in np.nditer([y, x]): ...: print(i, j) ...: 1 1.3432504 1 -1.3311479 1 1.0 -1 1.8205529 -1 -0.6346681 -1 1.0 1 0.98632067 1 -1.8885762 1 1.0 的迭代。例如最简单的情况:

(i,j) pair of values for each broadcastable combination of

这会创建and y . x is (3, 3), x is (3,1) y x,结果是迭代超过(3,3).flat。

(如果np.arange(n)nditernditer将生成(3,1)数组与(1,n)的所有组合,即(3,n)集。

您无法轻易告诉x仅对external_loop行进行迭代。 ndindex有点做,但不可预测。

In [38]: for i,j in np.ndindex(2,3): ...: print(i,j) ...: 0 0 0 1 0 2 1 0 1 1 1 2 生成给定深度的索引,但它是通过创建正确形状的数组来实现的。

In [39]: for i in np.ndindex(3):
    ...:     print(y[i], x[i,:])
    ...:     
[1] [[ 1.3432504 -1.3311479  1.       ]]
[-1] [[ 1.8205529 -0.6346681  1.       ]]
[1] [[ 0.98632067 -1.8885762   1.        ]]

或者迭代2个数组的行:

for i in range(3):

但你也可以使用np.nditer

cython,无论如何都是开发c-api或其他nditer代码的垫脚石。 apply_along_axis的c-api版本具有很强的功能和相对较好的速度。 python等价物不快也不强大。

您的评论提到了与ndindex的进一步接口。这是用Python编写的,并使用$array = ["Lorem ipsum dolor sit amet, consectetur adipiscing elit", "Praesent elementum mattis risus at condimentum","It was popularised","and a search","There are many variations", "dolor Ipsum is not lrem", "dolor", "lrem", "dolor lrem"]; $text = "dolor lrem"; $strings = array_filter($array, function ($input) use ($text) { // Your string accuracy algorithm return ((similar_text($text, $input, $percent) * 10) >= 40); }); print_r($strings); 为需要迭代的轴生成索引。它可以使某些任务更方便,但它不会加速你的代码。