我有一个numpy值的数组,以及一个缩放因子列表,我想在每列中按比例缩放数组中的每个值
values = [[ 0, 1, 2, 3 ],
[ 1, 1, 4, 3 ],
[ 2, 1, 6, 3 ],
[ 3, 1, 8, 3 ]]
ls_alloc = [ 0.1, 0.4, 0.3, 0.2]
# convert values into numpy array
import numpy as np
na_values = np.array(values, dtype=float)
修改:澄清:
na_values
可以是库存累积回报的二维数组(即:标准化为第1天),其中每行代表一个日期,每列代表一个股票。数据将作为每个日期的数组返回。
我现在想通过其在投资组合中的分配来扩展每只股票的累积回报。因此,对于每个日期(即:ndarray
值的每一行,将ls_alloc
中的相应元素应用于数组元素
# scale each value by its allocation
na_components = [ ls_alloc[i] * na_values[:,i] for i in range(len(ls_alloc)) ]
这就是我想要的,但我不禁觉得必须有一种方法让 numpy自动为我做这件事吗?
就是这样,我觉得:
na_components = [ ls_alloc[i] * na_values[:,i] for i in range(len(ls_alloc)) ]
# display na_components
na_components
[array([ 0. , 0.1, 0.2, 0.3]), \
array([ 0.4, 0.4, 0.4, 0.4]), \
array([ 0.6, 1.2, 1.8, 2.4]), \
array([ 0.6, 0.6, 0.6, 0.6])]
应该能够表达为:
tmp = np.multiply(na_values, ls_alloc)
# display tmp
tmp
array([[ 0. , 0.4, 0.6, 0.6],
[ 0.1, 0.4, 1.2, 0.6],
[ 0.2, 0.4, 1.8, 0.6],
[ 0.3, 0.4, 2.4, 0.6]])
是否有一个能够实现我想要的优雅和简洁的numpy功能?
修改
我看到我的第一个解决方案已转置了我的数据,因此我返回了list
ndarrays
。 na_components[0]
现在为第一个股票提供ndarray
股票价值,每个日期提供1个元素。
我使用na_components
执行的下一步是通过对每个组件求和来计算投资组合的总累积回报
na_pfo_cum_ret = np.sum(na_components, axis=0)
这适用于单个股票回报列表ndarrays
。
答案 0 :(得分:5)
这个顺序对我来说似乎有些奇怪,但是IIUC,你需要做的就是将na_values
乘以array(ls_alloc)
的结果转置:
>>> v
array([[ 0., 1., 2., 3.],
[ 1., 1., 4., 3.],
[ 2., 1., 6., 3.],
[ 3., 1., 8., 3.]])
>>> a
array([ 0.1, 0.4, 0.3, 0.2])
>>> (v*a).T
array([[ 0. , 0.1, 0.2, 0.3],
[ 0.4, 0.4, 0.4, 0.4],
[ 0.6, 1.2, 1.8, 2.4],
[ 0.6, 0.6, 0.6, 0.6]])
答案 1 :(得分:1)
我不清楚你想做什么,但答案可能在Broadcasting rules。我想你想要:
values = np.array( [[ 0, 1, 2, 3 ],
[ 1, 1, 4, 3 ],
[ 2, 1, 6, 3 ],
[ 3, 1, 8, 3 ]] )
ls_alloc = np.array([ 0.1, 0.4, 0.3, 0.2])
和其中之一:
na_components = values * ls_alloc
或:
na_components = values * ls_alloc[:,np.newaxis]