Python 如何将具有np.column\u stack/np.row\u stack的for循环转换为生成器

Python 如何将具有np.column\u stack/np.row\u stack的for循环转换为生成器,python,numpy,for-loop,generator,Python,Numpy,For Loop,Generator,我有以下代码: from itertools import product from joblib import Parallel, delayed from operator import mul import numpy as np lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] arr = np.array(lst) flat = np.ravel(arr).tolist() lst = (list(a) for a in product(flat, r

我有以下代码:

from itertools import product
from joblib import Parallel, delayed
from operator import mul
import numpy as np

lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr = np.array(lst)

flat = np.ravel(arr).tolist()
lst = (list(a) for a in product(flat, repeat=2))
results = Parallel(n_jobs=-1)(delayed(mul)(x, y) for x, y in lst)

rows = arr.shape[0]
cols = arr.shape[1]

arr3d = np.array(results).reshape(rows, cols, rows, cols)

def stacking():
    final_arr = np.empty((1, cols*cols))   # Initialize final_arr
    for i in range(0,rows):
        first_block = arr3d[i,0]   # Initialize first_block
        for j in range(1,cols):
            first_block = np.column_stack((first_block, arr3d[i,j]))
        final_arr = np.row_stack((final_arr, first_block))
    yield np.delete(final_arr, 0, axis=0)

next(stacking())
我希望将for循环(I’s和j’s)转换为生成器。当我尝试为j循环执行此操作时:

def stacking():
    final_arr = np.empty((1, cols*cols))   # Initialize final_arr
    for i in range(0,rows):
        first_block = arr3d[i,0]   # Initialize first_block
        first_block = (np.column_stack((first_block, arr3d[i,j])) for j in range(1,cols))
        final_arr = np.row_stack((final_arr, first_block))
    yield np.delete(final_arr, 0, axis=0)

next(stacking())
我得到以下错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-35-ba342fd13303> in <module>
----> 1 next(stacking())

<ipython-input-34-303528d26770> in stacking()
      4         first_block = arr3d[i,0]   # Initialize first_block
      5         first_block = (np.column_stack((first_block, arr3d[i,j])) for j in range(1,cols))
----> 6         final_arr = np.row_stack((final_arr, first_block))
      7     yield np.delete(final_arr, 0, axis=0)

<__array_function__ internals> in vstack(*args, **kwargs)

~\Anaconda3\lib\site-packages\numpy\core\shape_base.py in vstack(tup)
    281     if not isinstance(arrs, list):
    282         arrs = [arrs]
--> 283     return _nx.concatenate(arrs, 0)
    284 
    285 

<__array_function__ internals> in concatenate(*args, **kwargs)

ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 9 and the array at index 1 has size 1
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在里面
---->1下一步(堆叠()
在堆栈中()
4第一块=arr3d[i,0]#初始化第一块
5第一个_块=(范围(1,cols)内j的np.列_堆栈((第一个_块,arr3d[i,j]))
---->6 final_arr=np.行堆栈(final_arr,first_block))
7产量np.删除(最终产量,0,轴=0)
在vstack(*args,**kwargs)中
vstack(tup)中的~\Anaconda3\lib\site packages\numpy\core\shape\u base.py
281如果不存在(arrs,列表):
282 arrs=[arrs]
-->283返回n.连接(arrs,0)
284
285
串联(*args,**kwargs)
ValueError:串联轴的所有输入数组维度必须完全匹配,但沿维度1,索引0处的数组大小为9,索引1处的数组大小为1
有没有办法将np.column\u stack/np.row\u stack与生成器一起使用


我基本上是想让这段代码运行得更快,使用更少的内存,因为我处理的是大型数组。如果有其他方法来调整这段代码,请让我知道!非常感谢。

在循环中,您唯一应该做的就是列表附加。所有的
堆叠
都在循环之外完成一次。只有当您将一个列表馈送到另一个列表时,生成器才有帮助,以此类推。它们在处理数组时没有用处。好的。有没有其他方法可以优化此代码的速度和内存?或者它已经是最优的了?所以你从一个
final\u arr=np.empty((1,cols*cols))
数组开始-一行垃圾。然后在它的末尾添加一堆,删除那些垃圾!为什么不从
np.empty((0,cols*cols))开始
?最好从列表开始,在列表中添加一个簇,然后在列表中添加列堆栈
串联
和所有的
堆栈
变体(除了
np.append
)都接受一个列表。好好利用这一点!