Equivalent of numpy.ascontiguousarray in Julia

I would like to change a non-contiguous array to a contiguous one. What is the fastest way to do that in Julia?

convert(Array,A) should work on objects which <:AbstractArray.

Seems like it is not working. I am not sure if you can reproduce the problem I am getting, but here it is anyways.

I am trying to use the numpy_to_vtk function from vtk.numpy_support through PyCall to change a Julia array to a vtk array. This function only accepts C contiguous arrays as input. Now even when trying to call np.array through PyCall, the returned array is a Julia array, and using np.ascontiguousarray through PyCall also doesn’t do the trick as shown by the following repeating error. The error persists even when using np.ascontiguousarray(julia_array) and np.array(convert(Array, julia_array)) before passing the array to numpy_to_vtk.

ERROR: PyError (:PyObject_Call) <type 'exceptions.AssertionError'>
AssertionError('Only contiguous arrays are supported.',)
  File "C:\Program Files\VTK 7.1.1\bin\Lib\site-packages\vtk\util\numpy_support.
py", line 131, in numpy_to_vtk
    assert z.flags.contiguous, 'Only contiguous arrays are supported.'

Perhaps the question can be rephrased to how to make a C contiguous array inside Julia?

Can you post a reproducible example?

1 Like
using PyCall
@pyimport numpy as np
@pyimport vtk.util.numpy_support as vtkns

julia_array = rand(3,3);
vtk_array = vtkns.numpy_to_vtk(np.array(julia_array))

Edited to add:

Using PyObject explicitly creates a proper numpy array with access to its fields and methods. I am interested in making a row-major or C contiguous array not an F contiguous array as shown by the flags.

julia> numpy_array = PyObject(np.array(rand(3,3)))
PyObject array([[ 0.55107837,  0.98646111,  0.80035289],
       [ 0.92075771,  0.08981173,  0.88408335],
       [ 0.50036782,  0.91732487,  0.65456648]])

julia> numpy_array[:flags]
PyObject   C_CONTIGUOUS : False
  F_CONTIGUOUS : True
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

vtk_array = vtkns.numpy_to_vtk(PyReverseDims(julia_array))

2 Likes

Perfect, thanks!

ETA: Except when I get the array back in Julia using vtk_to_numpy, it is trasposed, which is easy to work around, but worth mentioning.