python - 访问matlab矩阵的列及其在numpy中的实现
问题描述
我正在尝试找到一种访问与 Matlab 的功能相对应的 numpy 数组元素的实现。
假设给定一个(2,2,2)
Matlab 矩阵m
,形式为
m(:,:,1) = [1,2;3,4]
m(:,:,2) = [5,6;7,8]
即使这是一个 3-d 数组,Matlab 也允许以如下方式访问它的列
m(:,1) = [1;3]
m(:,2) = [2;4]
m(:,3) = [5;7]
m(:,4) = [6;8]
我很想知道,如果 numpy 支持这样的索引,那么给定以下数组
m = array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
也可以按照上面列出的 Matlab 的方式访问列。
解决方案
In [41]: m = np.arange(1,9).reshape(2,2,2)
In [42]: m
Out[42]:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
索引等效块:
In [47]: m[0,:,0]
Out[47]: array([1, 3])
In [48]: m[0,:,1]
Out[48]: array([2, 4])
In [49]: m[1,:,0]
Out[49]: array([5, 7])
In [50]: m[1,:,1]
Out[50]: array([6, 8])
我们可以重塑,以“展平”一对维度:
In [84]: m = np.arange(1,9).reshape(2,2,2)
In [85]: m.reshape(2,4)
Out[85]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
In [87]: m.reshape(2,4)[:,2]
Out[87]: array([3, 7])
并进行转置:
In [90]: m.transpose(1,0,2).reshape(2,4)
Out[90]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
MATLAB 最初是严格的 2d 的。然后在 v3.9 (2000) 左右的某个时候,他们允许更多,但以一种笨拙的方式。他们添加了一种方法来索引尾随维度,就好像它是多维的一样。在最近的另一个 SO 中,我注意到何时reshaping
到 (2,2,1,1) 结果仍然是 (2,2)。尾随尺寸 1 尺寸被挤出。
我怀疑这m(:,3)
也是结果。
测试 4d MATLAB
>> m=reshape(1:36,2,3,3,2);
>> m(:,:,1)
ans =
1 3 5
2 4 6
>> reshape(m,2,3,6)(:,:,1)
ans =
1 3 5
2 4 6
>> m(:,17)
ans =
33
34
>> reshape(m,2,18)(:,17)
ans =
33
34
推荐阅读
- mysql - 让所有参与者通过 group by 和 self join
- javascript - Webpack 需要 30 秒来编译
- python - Tensorflow 2.2.0 错误:[Predictions must be > 0] [Condition x >= y did not hold element-wise:] while using Bidirectional LSTM layer
- clojure - 如何在 clojure REPL 中正确设置时区?
- spring-boot - 带有 h2 驱动程序的 spring-boot fat jar 无法构建 graalvm 本机映像
- jekyll - 将 Jekyll 帖子数据与来自 YAML 的数据相结合以创建新的博客提要
- c++ - C++ 动态调度函数
- parameters - 直接放入未执行时,参数获取值
- r - 在特定的 ggplots 中添加一个百分比符号来标记,而不是在其他图中
- php - 活动菜单不保持活动状态并突出显示