我正在尝试将数据转换为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 ]])
如果有人可以帮助我了解这种行为。它在第二种情况下做正确的事情,但我发现第一种情况不是直接的。为什么第一种情况如此?
答案 0 :(得分:1)
从ndarray
上的documentation签名。
ndarray(shape, dtype, buffer, offset, strides, order)
- 如果
buffer
为None,则仅使用shape,dtype和order。- 如果
buffer
是暴露缓冲区接口的对象,则将解释所有关键字。
对于第一个示例来说,即使buffer
是整数np.array
,ndarray
也会将其解释为其他类型。您必须给它 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_mat
与randoms.reshape(n,m)
或np.random.normal(size=(n,m))
等效。
ndarray
通常仅在buffer
来自其他来源时才需要,而这还不是ndarray
可以重塑或viewed
的东西。>