如何使用numpy ndarray使用给定数据创建n维数组

时间:2018-07-13 05:17:28

标签: python numpy multidimensional-array

我正在尝试将数据转换为ndarray。尽管我得到了想要的东西,但是在测试时我无法弄清楚为什么它会给我这个输出。

我得到输出:

np.ndarray(shape = (2,1),buffer = np.array([1,2,3,4]))
array([[4.24399158e-314],
   [8.48798317e-314]])

不过,对于此区块,我可以按照自己的方式投射随机数。

def x_mat(n,m):
   np.random.seed(0)
   randoms = np.random.normal(size=n*m)
   print(randoms)
   rand_mat = np.ndarray(shape = (n,m),buffer = randoms)
   return(rand_mat)
x_mat(5,2)

给出:

[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799 -0.97727788 
  0.95008842 -0.15135721 -0.10321885  0.4105985 ]


array([[ 1.76405235,  0.40015721],
       [ 0.97873798,  2.2408932 ],
       [ 1.86755799, -0.97727788],
       [ 0.95008842, -0.15135721],
       [-0.10321885,  0.4105985 ]])

如果有人可以帮助我了解这种行为。它在第二种情况下做正确的事情,但我发现第一种情况不是直接的。为什么第一种情况如此?

2 个答案:

答案 0 :(得分:1)

ndarray上的documentation签名。

ndarray(shape, dtype, buffer, offset, strides, order)

  
      
  1. 如果buffer为None,则仅使用shape,dtype和order。
  2.   
  3. 如果buffer是暴露缓冲区接口的对象,则将解释所有关键字。
  4.   

对于第一个示例来说,即使buffer是整数np.arrayndarray也会将其解释为其他类型。您必须给它 optional 自变量dtype = int,以便ndarray明确知道其元素是整数类型。

np.ndarray(shape = (2,1), dtype = int, buffer = np.array([1,2,3,4]))

答案 1 :(得分:1)

In [164]: x = np.array([1,2,3,4])
In [165]: x.__array_interface__
Out[165]: 
{'data': (40465184, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (4,),
 'version': 3}

使用ndarray创建的数组具有相同的data缓冲区:

In [166]: y = np.ndarray(shape = (2,1),buffer = x)
In [167]: y
Out[167]: 
array([[5.e-324],
       [1.e-323]])
In [168]: y.__array_interface__
Out[168]: 
{'data': (40465184, False),        # same as for x
 'strides': None,
 'descr': [('', '<f8')],
 'typestr': '<f8',
 'shape': (2, 1),
 'version': 3}

以及使用int dtype的数组:

In [169]: z = np.ndarray(shape = (2,1),buffer = x, dtype=int)
In [170]: z.__array_interface__
Out[170]: 
{'data': (40465184, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 1),
 'version': 3}

实际上,我们不需要传递x作为缓冲区参数,而只需传递其x.data属性:

In [171]: np.ndarray(shape = (2,1), buffer = x.data, dtype=int)
Out[171]: 
array([[1],
       [2]])

由于共享数据缓冲区的原因,对z的修改也出现在x中     在[172]中:z [:] * = 2     在[173]中:z     出[173]:     数组([[2],            [4]]     在[174]中:x     Out [174]:array([2,4,3,4])

y

In [175]: y
Out[175]: 
array([[1.e-323],
       [2.e-323]])

使用offset,我们可以创建一个数组来选择数据缓冲区的不同部分:

In [178]: w=np.ndarray(shape = (2,1), buffer = x.data, dtype=int, offset=8)
In [179]: w
Out[179]: 
array([[4],
       [3]])

但是通常我们不使用ndarray来执行此操作。相反,我们使用切片来获取view,并在需要时使用reshape

In [181]: x[1:3].reshape(2,1)
Out[181]: 
array([[4],
       [3]])

您可以将rand_matrandoms.reshape(n,m)np.random.normal(size=(n,m))等效。

ndarray通常仅在buffer来自其他来源时才需要,而这还不是ndarray可以重塑或viewed的东西。