rap*_*yre 3 python matlab numpy scipy
作为更大函数的一部分,我正在编写一些代码来生成包含输入向量/矩阵"x"的每列的平均值的向量/矩阵(取决于输入).这些值存储在与输入矢量相同形状的矢量/矩阵中.
我对它在1-D和矩阵阵列上工作的初步解决方案非常(!)凌乱:
# 'x' is of type array and can be a vector or matrix.
import scipy as sp
shp = sp.shape(x)
x_mean = sp.array(sp.zeros(sp.shape(x)))
try: # if input is a matrix
shp_range = range(shp[1])
for d in shp_range:
x_mean[:,d] = sp.mean(x[:,d])*sp.ones(sp.shape(z))
except IndexError: # error occurs if the input is a vector
z = sp.zeros((shp[0],))
x_mean = sp.mean(x)*sp.ones(sp.shape(z))
Run Code Online (Sandbox Code Playgroud)
来自MATLAB背景,这就是它在MATLAB中的样子:
[R,C] = size(x);
for d = 1:C,
xmean(:,d) = zeros(R,1) + mean(x(:,d));
end
Run Code Online (Sandbox Code Playgroud)
这适用于矢量和矩阵,没有错误.
我的问题是,如何在没有(丑陋的)try/except块的情况下使我的python代码能够处理向量和矩阵格式的输入?
谢谢!
您不需要为平均计算本身区分向量和矩阵 - 如果使用axis参数Numpy将沿向量(对于向量)或列(对于矩阵)执行计算.然后构造输出,你可以使用一个很好的老式列表理解,虽然它对于巨大的矩阵来说可能有点慢:
import numpy as np
m = np.mean(x,axis=0) # For vector x, calculate the mean. For matrix x, calculate the means of the columns
x_mean = np.array([m for k in x]) # replace elements for vectors or rows for matrices
Run Code Online (Sandbox Code Playgroud)
使用列表推导创建输出很慢,因为它必须分配两次内存 - 一次用于列表,一次用于数组.使用np.repeat或np.tile将更快,但对于矢量输入行为有趣 - 输出将是一个嵌套矩阵,每行有一个长向量.如果速度比优雅更重要,您可以使用以下内容替换最后一行:
if len(x.shape) == 1:
x_mean = m*np.ones(len(x))
else:
x_mean = np.tile(m, (x.shape[1],1))
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你的Matlab代码对行向量和列向量的行为不同(尝试用x和运行它x').
| 归档时间: |
|
| 查看次数: |
940 次 |
| 最近记录: |