numpy空数组创建普通数组后更改值

时间:2019-05-30 13:23:00

标签: python numpy

我在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()相同的值?

2 个答案:

答案 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)