python - 有没有一种快速的方法可以将 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 数组的过程需要这么长时间。
解决方案
尝试从小处着手,在控制台中查看结果:
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)
使用numpy.append
速度相当慢,因为它每次都必须预先分配内存并复制整个数组。numpy 数组是一个连续的内存块。
如果您的计算机内存不足,您可能必须使用它。但在这种情况下,请尝试迭代适当的块,只要您的计算机仍然可以处理它们。重新排列维度有时是加快计算速度的一种方法。
推荐阅读
- angular - angular 6过滤器在界面上不起作用
- azure - 如何在 terraform 中继承/传递变量
- python - 如何在一列上分组并按日期排序,并且每个日期都使用熊猫在时间序列数据中按小时排序
- mysql - 我们如何将 AND & OR 运算符与简单连接一起使用?
- .net - 流的意外结束,在我朋友的电脑上,但不是我的。.Net 核心,SQL
- spring-security - Spring 安全性:ldap 配置
- android - 确定 Google 帐户是否可用
- django - 在进行连接的 Django 过滤器查询方法中使用 TO_CHAR
- java - Jackson:InvalidFormatException:无法从字符串值构造 java.util.Date 的实例
- c++ - 为什么给定默认值时,此模板参数推导失败?