numpy中np.array()与np.asarray的区别有哪些

发布时间:2021-12-15 15:30:37 作者:小新
来源:亿速云 阅读:242
# numpy中np.array()与np.asarray()的区别有哪些

在NumPy库中,`np.array()`和`np.asarray()`都是用于创建数组的常用函数,但它们在底层行为和应用场景上存在关键差异。本文将深入探讨两者的区别,并通过代码示例说明如何选择使用。

---

## 1. 核心区别概述

| 特性                | `np.array()`                     | `np.asarray()`                   |
|---------------------|----------------------------------|----------------------------------|
| **输入处理**         | 总是创建新数组                   | 若输入已是数组,默认不复制       |
| **内存效率**         | 可能更低(强制复制)             | 更高(避免冗余复制)             |
| **主要用途**         | 强制创建独立数组                 | 确保输入为数组但不强制复制       |

---

## 2. 详细行为对比

### 2.1 对输入数据的处理方式

**`np.array()`** 的行为:
```python
import numpy as np

data = [1, 2, 3]
arr1 = np.array(data)  # 创建新数组
data[0] = 100         # 修改原始数据
print(arr1)           # 输出: [1 2 3](不受影响)

np.asarray() 的行为:

data = [1, 2, 3]
arr2 = np.asarray(data)  # 创建新数组(因为输入是列表)
data[0] = 100
print(arr2)              # 输出: [1 2 3]

# 当输入已经是数组时
existing_arr = np.array([4, 5, 6])
arr3 = np.asarray(existing_arr)
existing_arr[0] = 400
print(arr3)              # 输出: [400   5   6](共享内存!)

关键区别: - 对非数组输入:两者行为相同 - 对数组输入asarray()不会复制数据


2.2 内存共享验证

通过np.may_share_memory()检查内存共享:

a = np.array([1, 2, 3])
b = np.array(a)       # 新数组
c = np.asarray(a)     # 视图

print(np.may_share_memory(a, b))  # False
print(np.may_share_memory(a, c))  # True

2.3 性能影响

在大型数组处理时差异显著:

large_data = np.random.rand(1000000)

# 测试np.array()
%timeit np.array(large_data)  
# 输出: 2.3 ms ± 45.8 µs per loop

# 测试np.asarray()
%timeit np.asarray(large_data)  
# 输出: 89.6 ns ± 0.752 ns per loop

3. 关键参数差异

3.1 copy参数的特殊性

np.array()copy参数:

a = np.array([1, 2, 3])
b = np.array(a, copy=False)  # 可能仍然复制!

np.asarray()本质上等价于:

np.array(input, copy=False, dtype=None)

3.2 类型强制的区别

类型推断行为:

data = [1.0, 2.0, 3.0]

# array()允许显式类型覆盖
arr1 = np.array(data, dtype=np.int32)  # 强制转换为int

# asarray()会保留输入数组的类型
existing = np.array([1.1, 2.2])
arr2 = np.asarray(existing, dtype=np.int32)  # 无效!

4. 实际应用场景

推荐使用np.array()的情况:

  1. 需要确保数据独立副本时
  2. 需要强制数据类型转换时
  3. 处理用户提供的可能非数组输入

推荐使用np.asarray()的情况:

  1. 函数参数处理(避免不必要复制)
    
    def process_data(input_data):
       data = np.asarray(input_data)
       # 安全操作...
    
  2. 性能敏感场景(大型数组处理)
  3. 当输入可能已经是数组时

5. 常见误区

误区1:认为asarray()绝对不复制

# 当dtype不匹配时仍会复制
a = np.array([1, 2, 3], dtype=np.float32)
b = np.asarray(a, dtype=np.int32)  # 强制复制!

误区2:忽略子类处理

class MyArray(np.ndarray): pass

a = np.array([1,2,3]).view(MyArray)
b = np.asarray(a)  # 保留子类类型
c = np.array(a)    # 降级为普通ndarray

6. 总结

选择原则 推荐函数
需要内存隔离 np.array()
接受视图以提高性能 np.asarray()
不确定输入是否为数组 np.asarray()
需要强制数据类型 np.array()

理解这些差异可以帮助开发者编写更高效、更符合预期的NumPy代码。 “`

文章长度约1100字,采用Markdown格式,包含: 1. 对比表格 2. 代码示例 3. 性能测试 4. 使用场景建议 5. 常见误区说明 6. 总结决策表

推荐阅读:
  1. Numpy中None的作用是什么
  2. OpenCV中的numpy如何在Python项目中使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

numpy np.array() np.asarray

上一篇:numpy中np.column_stack()和np.row_stack()怎么用

下一篇:如何进行Kafka源码分析及Broker端

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》