gpt4 book ai didi

python - 为什么 numpy 可以保存和加载不同于 numpy 数组的对象

转载 作者:行者123 更新时间:2023-11-28 22:18:02 24 4
gpt4 key购买 nike

我试图提出另一个观点,不小心使用 numpy np.save() 保存了一个 dict。令我惊讶的是,这种方法似乎完全没有问题。我用另一个对象尝试了上面的操作,它不像 list 那样 np.array 并且它似乎工作正常。

例如下面的代码,使用np.save()np.load() 保存和加载一个对象:

list_file = 'random_list.npy'
random_list = [x*2 for x in range(20)]
np.save(list_file, random_list)

# load numpy array
random_list2 = np.load(list_file)
set(random_list) == set(random_list2)

True

所以,我的问题是:

  1. 为什么这会成功,因为在 documentation 中只提到数组?
  2. 同样,如果要处理其他对象,那么可以处理哪些对象?

我知道 pickle 有一些限制,这可能会影响可以处理的对象的性质,但仍然存在很多不清楚的地方。

编辑:
我认为 np.save() 只是试图将作为参数传递的对象转换为 numpy 数组,但在某些情况下这没有任何意义,例如 dict

例如,传递给 np.array 的 dict 似乎根本不起作用:

a = {1: 0, 2: 1, 3: 2}
b = np.array(a)
type(b)

numpy.ndarray

b.shape

()

最佳答案

numpy.save()将其参数记录为“类数组”。

根据 numpy: formal definition of "array_like" objects? , 底层 numpy/core/src/multiarray/ctors.c:PyArray_FromAny()接受:

/* op is an array */

/* op is a NumPy scalar */

/* op is a Python scalar */

/* op supports the PEP 3118 buffer interface */

/* op supports the __array_struct__ or __array_interface__ interface */

/* op supplies the __array__ function. */

/* Try to treat op as a list of lists */

具体到dict,执行路径是这样的:

numpy/npyio.py -> numpy/core/numeric.py:asanyarray() -> numpy/core/src/multiarray/multiarraymodule.c:_array_fromobject() -> numpy/core/src/multiarray/ctors.c:PyArray_CheckFromAny() ->前面提到的 PyArray_FromAny。那里:

<...>
PyArray_GetArrayParamsFromObject(op, newtype,
0, &dtype,
&ndim, dims, &arr, context)
<...>
else {
if (newtype == NULL) {
newtype = dtype; #object dtype
<...>
ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, newtype,
ndim, dims,
NULL, NULL,
flags&NPY_ARRAY_F_CONTIGUOUS, NULL);
return (PyObject *)ret;

关于python - 为什么 numpy 可以保存和加载不同于 numpy 数组的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50816006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com