【问题标题】:Vectorization in python -- multidimensional matrix by the range of parameterspython中的向量化——参数范围的多维矩阵
【发布时间】:2020-08-01 09:53:39
【问题描述】:

我有10个参数,它们的范围是1到10。

我正在尝试为每个参数找到一个多维矩阵(数组),如下所示:

def function123(a,b,c,d,e,f,g,j,i,j):
    mat = np.array([a,b,c,d,e,f,g,j,i,j]).reshape(1,10)
    return mat * mat.T # 10 by 10  2D matrix

MAT = np.zeros([10,10,10,10,10,10,10,10,10,10]) #output matrix

for a in range(0,10):
    for b in range(0,10):
        for c in range(0,10):
            for d in range(0,10):
                for e in range(0,10):
                    for f in range(0,10):
                        for g in range(0,10):
                            for h in range(0,10):
                                for i in range(0,10):
                                    for j in range(0,10):
                                        MAT[a,b,c,d,e,f,g,j,i,j] = function123(a,b,c,d,e,f,g,j,i,j) 

有没有其他干净的方法来解决这个在 python 中疯狂的循环? 我只是不想看到 for 循环。 =[

提前感谢您的帮助!

【问题讨论】:

  • 原来的计算要复杂得多,所以我只是将计算部分简化为function123。 =]
  • 也许是这个? docs.scipy.org/doc/numpy/reference/generated/numpy.ndindex.html 如果函数足够复杂,则可能没有一种理智的方法来对其进行矢量化(例如,如果它对某个随机 Python 对象进行值查找
  • 运行此代码的任何人都应该知道,MAT(由 MAT = np.zeros([10,10,10,10,10,10,10,10,10,10]) 行创建)需要 80 GB 内存。
  • 如果您的函数仅适用于标量值,则您无法对数组创建进行矢量化。您必须为每个数组元素调用一次,全部 10**10 次。重新考虑你想要做什么!

标签: python numpy for-loop multidimensional-array iteration


【解决方案1】:

应该尊重 cmets,这段代码很可能存在内存问题(我在尝试时也遇到过)。本质上,可能应该有更好的方法来完成您的工作,并且使用这些 for 循环比我所做的要容易得多。我处理这个问题的方式是一个很好的挑战,下面的代码很好地处理了它。

def func123(a,b,c,d,e,f,g,i,j,k):
    return a*b*c*d*e*f*g*i*j*k

l = []
for i in range(10):
    arr = np.ones(10,dtype=int)
    arr[i] = 10
    l.append(np.arange(10).reshape(arr))

vec = np.vectorize(func123)
res = vec(l[0],l[1],l[2],l[3],l[4],l[5],l[6],l[7],l[8],l[9])

在这里,我将广播的奇妙特性用于 numpy 数组。如果您的内存允许,您可以更改函数的作用并仍然存储您的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-22
    • 2018-04-01
    • 1970-01-01
    • 2021-12-12
    • 2017-09-12
    • 2019-04-25
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多