我在numpy官方页面上读到,有一种创建初始化数组而不用零的方法:
空(不同于零)不会将数组值设置为零,因此可能略快。
我在下面创建了两个函数,这些函数演示了使用此函数的不寻常问题:
import numpy as np
def getInitialisedArray():
return np.empty((), dtype=np.float).tolist()
def createFloatArray(x):
return np.array(float(x))
如果我只是自己叫getInitialisedArray()
,则输出如下:
>>> getInitialisedArray()
0.007812501848093234
如果我只是调用createFloatArray()
函数:
>>> createFloatArray(3.1415)
3.1415
这一切似乎都很好,但是如果我重复测试并在创建float数组后调用getInitialisedArray()
,则会出现问题:
print(getInitialisedArray())
print(createFloatArray(3.1415))
print(getInitialisedArray())
输出:
>>>
0.007812501848093234
3.1415
3.1415
似乎第二次获取初始化数组的调用获得的值与普通np.array()
中的值相同。我不明白为什么会这样。它们不应该是彼此之间没有链接的单独数组吗?
---更新---
我重复了一次,并更改了空数组的大小:
import numpy as np
def getInitialisedArray():
# Changed size to 2 x 2
return np.empty((2, 2), dtype=np.float).tolist()
def createFloatArray(x):
return np.array(float(x))
print(getInitialisedArray())
print(createFloatArray(3.1415))
print(getInitialisedArray())
输出:
[[1.6717403e-316, 6.9051865033801e-310], [9.97338022253e-313, 2.482735075993e-312]]
3.1415
[[1.6717403e-316, 6.9051865033801e-310], [9.97338022253e-313, 2.482735075993e-312]]
这是我期望的那种输出,但是在这里它可以工作,因为我更改了大小。现在,大小是否会影响空数组是否具有与普通np.array()
相同的值?
答案 0 :(得分:1)
从documentation,np.empty()将“返回给定形状和类型的新数组,而无需初始化条目。”这应该意味着它将只在内存中为其分配的变量分配一个空间。存储器空间中的任何数据都不会更改。
在第一个示例中,您正在打印getInitialisedArray的返回值,而不实际存储它。然后,Python必须知道您没有存储该值的地址。然后,python将为需要地址的下一个值保留该地址。由于createFloatArray也未存储地址,因此地址中的值将更改为3.1415,而python将保留该地址用于下一次分配。再次调用getInitialisedArray时,它将再次使用该地址并打印出3.1415。但是,如果您更改数据类型(例如,更改数组的尺寸),则取决于python处理该数据类型的方式,它可能需要更多的内存块,并且必须获得其他地址。从理论上讲,如果createFloatArray与getInitialisedArray的形状相同,则它可能具有相同的行为。
警告!我强烈建议您不要这样做。通常,python或您的系统可能会在这两个操作之间执行任务,这将改变两次调用之间的内存地址,即使它是相同的数据类型。
答案 1 :(得分:0)
初始化后,检查每个阵列的id()
。 np.empty()
创建了一个空间,该空间以后可以在初始化相同形状的数组之后使用。
了解更多:
print(np.array(float(1))
print(np.empty((),dtype=np.float).tolist())
相同,但分配给变量:
x = np.array(float(1))
y = np.empty((),dtype=np.float).tolist()
print(x)
print(y)