![](/img/trans.png)
[英]How to create a uniform grid of n-dimensional vectors using numpy (in other words, uniformly fill a n-dimensional hypercube)?
[英]How to create an n-dimensional array using given data using numpy ndarray
我正在尝试将我的数据转换为 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 ]])
如果有人可以帮助我理解这种行为。 它在第二种情况下做了正确的事情,但我发现第一种情况并不直接。 为什么第一种情况是这样的?
来自带有签名的ndarray
文档。
ndarray(shape, dtype, buffer, offset, strides, order)
- 如果
buffer
为 None,则仅使用 shape、dtype 和 order。- 如果
buffer
是一个暴露缓冲区接口的对象,那么所有的关键字都会被解释。
对于第一个示例,似乎是这样,即使buffer
是整数的np.array
, ndarray
也将其解释为不同的类型。 您必须为其提供可选参数dtype = int
以便 ndarray 明确知道其元素是整数类型。
np.ndarray(shape = (2,1), dtype = int, buffer = np.array([1,2,3,4]))
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
中 In [172]: z[:] *= 2 In [173]: z Out[173]: array([[2], [4]])输入 [174]: x 输出[174]: 数组([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]])
您可以使用randoms.reshape(n,m)
或np.random.normal(size=(n,m))
构造等价的rand_mat
。
ndarray
通常仅在buffer
来自其他来源时才需要,这些来源还不是可以ndarray
或viewed
的 ndarray 。
让我们考虑您的第一个示例:
n = np.ndarray(shape=(2,2), buffer= np.array([1,12,3,4,5,6]), dtype=int, order='F')
#Note that order is 'F' here and the the order changes from above.
print(n)
Output:
[[ 1 3]
[12 4]]
观察由于提供了缓冲区,现在它进一步研究了形状、数据类型和顺序。 让我们将顺序更改为“c”,看看会发生什么。
n = np.ndarray(shape=(2,2), buffer= np.array([1,12,3,4,5,6]), dtype=int, order='C')
#Note that order is 'C' here.
print(n)
[[ 1 12]
[ 3 4]]
现在,让我们将缓冲区设为“无”。 然后它只需要 0 和 1 的值并将形状和 dtype 应用到它。
n = np.ndarray(shape=(2,2), buffer= None, dtype=int, order='F')
print(n)
Output:
[[1 1]
[1 0]]
总而言之,只要有缓冲区,就需要一个数组。 它必须对其应用 dtype、order 和 shape。 当它为无时,缓冲区根本不适用。 希望这可以帮助!:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.