首页 > 解决方案 > 有没有一种快速的方法可以将 4D 数组的一个轴乘以与该轴相同长度的向量中的元素?

问题描述

我有两个形状列表 (130, 64, 2048),称为 (s, f, b),还有一个长度为 64 的向量,称为 v。我需要将这两个列表附加在一起以制作形状列表 ( 130, 2, 64, 2048) 并将 f[i] 中的所有 2048 个值与 v 的第 i 个值相乘。

输出数组还需要具有形状 (130, 2, 64, 2048)

显然,这两个步骤可以互换完成。我想知道做这种事情的最 Pythonic 的方式。

我的主要问题是我的代码需要永远将列表转换为 numpy 数组,这对于我的某些计算是必需的。我有:

new_prof = np.asarray( new_prof )

但这对于我的列表的大小和形状来说似乎需要两个长的时间。关于如何更好地初始化它的任何想法?

我的尝试显示了上面概述的问题:

    # Converted data should have shape (130, 2, 64, 2048)
    converted_data = IQUV_to_AABB( data, basis = "cartesian" )

    new_converted = np.array((130, 2, 64, 2048))

    # I think s.shape is (2, 64, 2048) and cal_fa has length 64
    for i, s in enumerate( converted_data ):
        aa = np.dot( s[0], cal_fa )
        bb = np.dot( s[1], cal_fb )
        new_converted[i].append( (aa, bb) )

但是,此代码不起作用,我认为它与点积有关。也许??

我也很想知道为什么将我的列表更改为 numpy 数组的过程需要这么长时间。

标签: pythonarraysmultidimensional-array

解决方案


尝试从小处着手,在控制台中查看结果:

import numpy as np

x = np.arange(36)
print(x)

y = np.reshape(x, (3, 4, 3))
print(y)

# this is a vector of the same size as dimension 1
a = np.arange(4)
print(a)

# expand and let numpy's broadcasting do the rest
# https://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
# https://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc
b = a[np.newaxis, :, np.newaxis]
print(b)

c = y * b
print(c)

你可以在np.newaxis 这里这里这里阅读。

使用numpy.append速度相当慢,因为它每次都必须预先分配内存并复制整个数组。numpy 数组是一个连续的内存块。

如果您的计算机内存不足,您可能必须使用它。但在这种情况下,请尝试迭代适当的块,只要您的计算机仍然可以处理它们。重新排列维度有时是加快计算速度的一种方法。


推荐阅读