python - 如何防止numpy折叠行?
问题描述
我有一个函数,它接受一个 numpy 数组并输出一个 numpy 数组。但是,当输出数组包含一个常量值时,使用 numpy 数组调用函数会导致所述值被“折叠”。
我正在尝试使用 numpy 编写向量微积分库,并且希望将向量传递给向量值函数,而不是依赖迭代。
r1 = lambda t: np.array([2*t, 1])
r2 = lambda t: np.array([2*t, 1+0*t])
t = np.linspace(0, 1)
print(r1(t).shape)
print(r2(t).shape)
人们会期望r1(t)
和r2(t)
具有相同的形状,但事实并非如此。r1(t)
产生一个看起来像 的对象
array([ array([...]), 1, dtype=object)
,并r2(t)
产生一个看起来像的东西array([ [...], [...])
(其中[...]
表示有效的浮点数组)。我猜r2(t)
由于浮点错误不同,它可以正常工作,但我可能是错的。有没有办法防止 numpy 折叠第二行或“展开”它?
解决方案
In [183]: r1 = lambda t: np.array([2*t, 1])
...: r2 = lambda t: np.array([2*t, 1+0*t])
...: t = np.linspace(0, 1)
In [184]: r1(t)
Out[184]:
array([array([0. , 0.04081633, 0.08163265, 0.12244898, 0.16326531,
0.20408163, 0.24489796, 0.28571429, 0.32653061, 0.36734694,
0.40816327, 0.44897959, 0.48979592, 0.53061224, 0.57142857,
0.6122449 , 0.65306122, 0.69387755, 0.73469388, 0.7755102 ,
0.81632653, 0.85714286, 0.89795918, 0.93877551, 0.97959184,
1.02040816, 1.06122449, 1.10204082, 1.14285714, 1.18367347,
1.2244898 , 1.26530612, 1.30612245, 1.34693878, 1.3877551 ,
1.42857143, 1.46938776, 1.51020408, 1.55102041, 1.59183673,
1.63265306, 1.67346939, 1.71428571, 1.75510204, 1.79591837,
1.83673469, 1.87755102, 1.91836735, 1.95918367, 2. ]),
1], dtype=object)
In [185]: r2(t)
Out[185]:
array([[0. , 0.04081633, 0.08163265, 0.12244898, 0.16326531,
0.20408163, 0.24489796, 0.28571429, 0.32653061, 0.36734694,
0.40816327, 0.44897959, 0.48979592, 0.53061224, 0.57142857,
0.6122449 , 0.65306122, 0.69387755, 0.73469388, 0.7755102 ,
0.81632653, 0.85714286, 0.89795918, 0.93877551, 0.97959184,
1.02040816, 1.06122449, 1.10204082, 1.14285714, 1.18367347,
1.2244898 , 1.26530612, 1.30612245, 1.34693878, 1.3877551 ,
1.42857143, 1.46938776, 1.51020408, 1.55102041, 1.59183673,
1.63265306, 1.67346939, 1.71428571, 1.75510204, 1.79591837,
1.83673469, 1.87755102, 1.91836735, 1.95918367, 2. ],
[1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ,
1. , 1. , 1. , 1. , 1. ]])
In [186]: r1(t).shape
Out[186]: (2,)
In [187]: r2(t).shape
Out[187]: (2, 50)
r2
组合两个t
形状匹配的数组 (50,),因此结果是一个 (2,50) 形状的数值数组。
r1
将 (50,) 数组与标量组合在一起1
。结果是一个 2 元素数组 object dtype。看到显示器1
末端的悬空了吗?r1
混合不同大小的元素会产生一个类似数组的列表,因为它不能像r2
推荐阅读
- python - python中的扩展切片如何工作?
- typescript - 使用 react-scripts-ts 声明要在不同文件中使用的 const 枚举
- c# - MSAL,推荐去新版2.0.0预览
- phaser-framework - Phaser 中的状态管理
- ssl - 关于 HTTPS 的困惑 --> SSL 握手是如何发生的
- arrays - 将所有数据保存在数组中,过滤掉重复数据,比较数组之间的数据并删除匹配的数据
- java - 使用 Scanner 对象和 while 循环重复局部变量错误
- php - 用“when”验证 Laravel 中集合的字段值,如果某些条件为真,则省略结果
- java - 创建多个在 xml 中声明的具有相同样式的动态 TextView
- php - 时间选择器格式更改,插入数据库时