
numpy中np.array和np.asarray的差异及其tolist方法
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
在Python的科学计算库NumPy中,`np.array()`和`np.asarray()`分别用于生成数组的对象方法,在处理现有数据时存在具体表现上的差异。本文将深入分析这两个函数的具体区别,并介绍`.tolist()`该方法的主要作用是将数组转换为可序列化的数据结构。让我们掌握 `np.array()` 和 `np.asarray()` 的核心功能。这些函数都能将不同类型的数据结构(如列表、元组)转换为NumPy的多维数组(ndarray)。然而,当输入已经是ndarray时,它们的处理方式就有所不同了。
**当输入为列表时**:
- `np.array()` 会生成一个新的ndarray对象,即使输入已经是ndarray类型,它也会复制数据内容并占用独立的内存区域。
- `np.asarray()` 在输入是ndarray的情况下,将直接返回一个引用相同的数组对象,因此修改原始数组会影响该assembled对象。
```python
a = [[1,2,3],[4,5,6],[7,8,9]]
b = np.array(a)
c = np.asarray(a)
a[2] = 1
print(a) # 修改列表不影响b和c
print(b)
print(c)
```在输入为ndarray的情况下,在使用np.array()时会生成一个独立于原始数据的新副本。而采用np.asarray()方法则会返回一个基于原始数据的视图(view),因此修改原始数组后该ndarray的内容也会相应更新。```python
a = np.random.random((3,3))
print(a.dtype)
b = np.array(a, dtype=float64) # 创建副本
c = np.asarray(a, dtype=float64) # 创建视图
a[2] = 2
print(a)
print(b) # b不受a影响
print(c) # c受a影响,因为是视图
```如前所述,在示例中当进行数据类型更改时,使用 `np.array()` 方法会产生一个新的数组。相比之下,`np.asarray()` 仅用于数据类型的转换而不进行复制。因此,在使用浮点型输入的情况下,即使修改原始数值,基于 `np.asarray()` 创建的数组也会反映这些变化。
3. **转换为列表类型**:
`.tolist()`方法能够将ndarray对象转化为Python内置的列表数据结构。这个操作特别适用于需要将数组序列化或与其他不支持ndarray格式的数据处理库进行交互的情形,这是因为原始的数据结构无法直接被这些系统使用。在此过程中,数据会被重新组织以适应目标系统的存储和传输需求。
此操作特别适用于需将数据转换为其他格式(如JSON或XML)进行存储或传输的情形,这是因为原始的数据结构无法直接被这些系统使用。数据序列化是指将原始信息按照特定格式编码以便于保存和交换的过程,常见的表现形式包括JSON和XML等标准格式。
```python
a = np.random.random((3,3))
b = a.tolist()
a[1] = 2
print(a) # 修改ndarray会影响自身
print(b) # 不影响转换后的列表
```
补充知识:在计算机视觉库OpenCV中,我们偶尔需要将整数转换为固定长度的字符串。例如,在保存图像文件名时,这会有所帮助。`cv::format`函数能够让我们精确设置数值的小数位数。```cpp
int currentFrame = 2;
std::stringstream frame_name;
frame_name << cv::format(%.3d, currentFrame) << .jpg;
或者使用C++11的字符串操作
std::string save_frame_path = std::to_string(currentFrame).substr(0,3) + .jpg;
```总体而言,在创建ndarray时,`np.array()`和`np.asarray()`的核心区别在于数据复制策略的不同。而`.tolist()`这一方法则主要用于将一个ndarray转换为可访问的Python列表结构。掌握这些差异对有效地管理与操作NumPy数组具有关键的重要性。当处理大数据量时,尽量减少不必要的数据拷贝能够明显提升程序运行效率。
全部评论 (0)


