访问matlab矩阵的列及其在numpy中的实现
Accessing columns of matlab matrix and its realization in numpy
我正在尝试找到一种访问 numpy 数组元素的实现,对应于 Matlab 的一个特性。
假设给定一个 (2,2,2)
Matlab 矩阵 m
m(:,:,1) = [1,2;3,4]
m(:,:,2) = [5,6;7,8]
尽管这是一个 3 维数组,但 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
我对这个问题的回答如下,假设给定问题中列出的数组
m = array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
可以创建一个列表,我称其为 m_list
形式
m_list = [m[i][:,j] for i in range(m.shape[0]) for j in range(m.shape[-1])]
这将以
的形式输出 m_list
m_list = [array([1, 3]), array([2, 4]), array([7, 9]), array([ 8, 10])]
现在我们可以访问 m_list
的元素,就像问题中列出的 Matlab 一样。
我正在尝试找到一种访问 numpy 数组元素的实现,对应于 Matlab 的一个特性。
假设给定一个 (2,2,2)
Matlab 矩阵 m
m(:,:,1) = [1,2;3,4]
m(:,:,2) = [5,6;7,8]
尽管这是一个 3 维数组,但 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
我对这个问题的回答如下,假设给定问题中列出的数组
m = array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
可以创建一个列表,我称其为 m_list
形式
m_list = [m[i][:,j] for i in range(m.shape[0]) for j in range(m.shape[-1])]
这将以
的形式输出m_list
m_list = [array([1, 3]), array([2, 4]), array([7, 9]), array([ 8, 10])]
现在我们可以访问 m_list
的元素,就像问题中列出的 Matlab 一样。