numpy: np.asarray 函数

Syntax

np.asarray(a, dtype=None, order=None)

将结构数据转化为ndarray。

**Parameters: **

  • a : array_like
  • dtype : data-type, optional
  • order : {‘C’, ‘F’}, optional

**Returns: **

  • out : ndarray

与 np.array 的不同

np.asarray的定义:

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

np.array的定义:

def array(a, dtype=None, order=None):
    return array(a, dtype, copy=True, order=order)

简而言之:
主要区别在于 np.array(默认情况下)将会copy该对象,而 np.asarray除非必要,否则不会copy该对象。

Code

# 将list转换为ndarray
a = [1, 2]
print(np.asarray(a))    # array([1, 2])

# 将ndarray转换为list
a.tolist()
print(a)    # [1, 2]

# 如果对象本身即为ndarray,且不改变dtype,则不会copy之
a = np.array([1, 2])
print(np.asarray(a) is a)    # True

# 如果对象本身即为ndarray,且改变dtype,则还是会copy之
a = np.array([1, 2], dtype=np.float32)
print(np.asarray(a, dtype=np.float32) is a)    # True
print(np.asarray(a, dtype=np.float64) is a)    # False
<think>我们遇到了一个TypeError,提示np.matrix不被支持,需要转换为numpy数组。 这个错误通常发生在使用一些不再支持numpy矩阵(np.matrix)的库或函数时,因为np.matrix在未来的版本中会被移除,且许多库已转向支持数组(array)而非矩阵(matrix)。 因此,我们需要将np.matrix对象转换为numpy数组(np.array)或使用np.asarray进行转换。 解决方案: 使用np.asarray()将矩阵转换为数组,例如: import numpy as np matrix = np.matrix([[1, 2], [3, 4]]) # 这是一个矩阵对象 array = np.asarray(matrix) # 转换为数组 这样,array就是一个numpy数组,可以用于后续操作。 为什么需要转换? 因为np.matrix是二维的,并且有一些与数组不同的行为(比如乘法是矩阵乘法,而数组的乘法是元素级乘法)。现在,numpy官方推荐使用数组,并且用@运算符进行矩阵乘法,因此很多库不再支持matrix类型。 示例代码: import numpy as np from sklearn.preprocessing import StandardScaler # 假设我们有一个矩阵 data_matrix = np.matrix([[1.0, 2.0], [3.0, 4.0]]) # 尝试使用StandardScaler会报错 # scaler = StandardScaler() # scaler.fit(data_matrix) # 这里会报错:TypeError: np.matrix is not supported. # 正确做法:转换为数组 data_array = np.asarray(data_matrix) scaler = StandardScaler() scaler.fit(data_array) # 现在可以正常运行 注意:np.asarray不会复制数据,如果矩阵是连续的,则返回一个视图,否则会复制。如果希望确保不共享数据,可以使用np.array()并指定copy=True。 另外,如果代码中大量使用矩阵,建议重构为数组,并使用@运算符进行矩阵乘法,避免使用矩阵的*运算符(因为矩阵的*是矩阵乘法,而数组的*是元素乘法)。 因此,遇到这个错误,只需将矩阵转换为数组即可。 §§相关问题§§ 1. 为什么numpy官方推荐使用数组(array)而不是矩阵(matrix)? 2. 在哪些情况下使用np.asarray会返回原始数据的视图而不是复制? 3. 如何检查一个numpy对象是矩阵还是数组? 4. 使用数组(array)时,如何执行矩阵乘法? 5. 除了StandardScaler,还有哪些常用的scikit-learn预处理工具不支持矩阵(matrix)?</think>### 解决 `TypeError: np.matrix is not supported. Please convert to a numpy array with np.asarray` #### 错误原因分析 1. **历史背景**: - `np.matrix` 是 NumPy 早期用于矩阵运算的专用类(始终为二维) - 自 NumPy 1.19(2020年)起,官方已弃用 `np.matrix`,推荐使用常规的 `np.ndarray` - 现代库(如 scikit-learn, TensorFlow, PyTorch)已全面停止对 `np.matrix` 的支持 2. **根本问题**: - 当前代码尝试将 `np.matrix` 对象传递给仅支持 `np.ndarray` 的函数 - 两者核心区别: ```python matrix = np.matrix([[1,2],[3,4]]) # 始终二维 array = np.array([[1,2],[3,4]]) # 支持任意维度 ``` #### 解决方案 使用 `np.asarray()` 进行安全转换: ```python import numpy as np # 原始矩阵对象 matrix_data = np.matrix([[1, 2], [3, 4]]) # 转换为标准数组 array_data = np.asarray(matrix_data) # 类型变为 np.ndarray # 验证转换 print(type(array_data)) # 输出:<class 'numpy.ndarray'> print(array_data.shape) # 输出:(2, 2) ``` #### 替代转换方法 | 方法 | 特点 | 适用场景 | |------|------|----------| | `np.asarray(matrix)` | 不复制数据(原矩阵内存共享) | 内存敏感场景 | | `np.array(matrix)` | 创建独立副本 | 需修改数据不影响原矩阵 | | `matrix.A` | 矩阵对象的属性直接返回数组 | 简洁写法(`matrix_data.A`) | #### 实际应用示例 ```python from sklearn.preprocessing import StandardScaler # 错误用法(触发TypeError) # scaler = StandardScaler().fit(np.matrix([[1,2],[3,4]])) # 正确用法 scaler = StandardScaler().fit(np.asarray(np.matrix([[1,2],[3,4]]))) ``` #### 最佳实践建议 1. **彻底重构**:将所有 `np.matrix` 创建替换为 `np.array` 2. **矩阵乘法**:用 `@` 运算符替代 `*`(`array1 @ array2` 替代 `matrix1 * matrix2`) 3. **特殊操作**: - 矩阵转置:用 `array.T` 替代 `matrix.T` - 逆矩阵:用 `np.linalg.inv(array)` 替代 `matrix.I`
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值