2014-11-04 1 views
1

Если бы я изменить в 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) или если вторичный размер более неоднозначен?

+0

'reshape (z, 4, x)' будет выглядеть так, как вы хотите, нет? – StefanKarpinski

+0

@StefanKarpinski Нет, что даст [1,5] в качестве первых двух чисел не [1,2] – ccsv

ответ

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 

Как для вашего бонусного вопрос

«также есть способ сделать изменить без указания второй размер как reshape (z, x), или если вторичный размер больше неоднозначный? "

ответ не совсем, потому что это было бы неоднозначным: reshape может сделать 3D, 4D, ..., тензоры поэтому его не ясно, что, как ожидается. Вы можете, однако, сделать что-то вроде

matrix_reshape(z,x) = reshape(z, x, div(length(z),x)) 

который делает то, что я думаю, вы ожидаете.

3

Я думаю, что вы нанесли NumPy stores in row-major order и Julia stores arrays in column major order как покрытый here.

Так Джулия делает то, что NumPy будет делать, если вы использовали

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) 

вы хотите знать, если есть что-то который будет вычислять 2-е измерение, предполагая, что массив 2-мерный? Не то, что я знаю из. Возможно 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 
+0

Итак, если одна из библиотек python, которую я использую, имеет 'reshape' в python, я думаю, было бы сложно переключить ее на julia без использования Arrayview? Похоже, для этого должен быть встроенный метод линейной алгебры. – ccsv