在朱莉亚重塑

时间:2014-11-04 10:56:48

标签: python-3.x numpy reshape julia

如果我在python中重塑,我使用它:

import numpy as np

y= np.asarray([1,2,3,4,5,6,7,8])
x=2
z=y.reshape(-1, x)


print(z)

得到这个

>>> 
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

我如何在朱莉娅得到同样的东西?我试过了:

z = [1,2,3,4,5,6,7,8]
x= 2
a=reshape(z,x,4)

println(a)

它给了我:

[1 3 5 7
 2 4 6 8]

如果我使用reshape(z,4,x),则会提供

[1 5
 2 6
 3 7
 4 8]

还有一种方法可以在不指定第二个维度(例如reshape(z,x))或者辅助维度更加模糊的情况下进行重新整形吗?

3 个答案:

答案 0 :(得分:3)

我认为您所涉及的内容是NumPy stores in row-major orderJulia stores arrays in column major order,涵盖here

所以如果你使用

,朱莉娅正在做的事情会发生什么
z=y.reshape(-1,x,order='F')

你想要的是第一次尝试的转置,即

z = [1,2,3,4,5,6,7,8]
x= 2
a=reshape(z,x,4)'

println(a)

你想知道是否有东西会计算第二维,假设数组是二维的?从来没听说过。可能ArrayViews?这是一个简单的启动功能

julia> shape2d(x,shape...)=length(shape)!=1?reshape(x,shape...):reshape(x,shape[1],Int64(length(x)/shape[1]))
shape2d (generic function with 1 method)

julia> shape2d(z,x)'
4x2 Array{Int64,2}:
 1  2
 3  4
 5  6
 7  8

答案 1 :(得分:3)

怎么样

z = [1,2,3,4,5,6,7,8]
x = 2
a = reshape(z,x,4)'

给出了

julia> a = reshape(z,x,4)'
4x2 Array{Int64,2}:
 1  2
 3  4
 5  6
 7  8

关于你的奖金问题

  

“还有一种方法可以在不指定第二个的情况下进行重塑   尺寸像重塑(z,x)或次要维度更多   暧昧?“

答案并不完全正确,因为它含糊不清:reshape可以制作3D,4D,...,张量因此不清楚预期的内容。但是,您可以执行类似

的操作
matrix_reshape(z,x) = reshape(z, x, div(length(z),x))

这就是我所期待的。

答案 2 :(得分:0)

  

“还有一种方法可以不指定第二维(例如reshape(z,x)),或者如果第二维更不明确,就可以进行整形?”

使用:代替-1

我正在使用Julia 1.1(不确定最初回答时是否有功能)

julia> z = [1,2,3,4,5,6,7,8]; a = reshape(z,:,2)
4×2 Array{Int64,2}:
 1  5
 2  6
 3  7
 4  8

但是,如果您希望第一行是1 2并与Python匹配,则需要遵循另一个答案,提到行优先与列优先的顺序,然后执行

julia> z = [1,2,3,4,5,6,7,8]; a = reshape(z,2,:)'
4×2 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 1  2
 3  4
 5  6
 7  8