python – Elementwise乘以1D-numpy数组(形状(k,1)或(k,))并且结果具有第一个的形状
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Elementwise乘以1D-numpy数组(形状(k,1)或(k,))并且结果具有第一个的形状,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2235字,纯文字阅读大概需要4分钟。
内容图文
![python – Elementwise乘以1D-numpy数组(形状(k,1)或(k,))并且结果具有第一个的形状](/upload/InfoBanner/zyjiaocheng/808/4b02a48513a64ed28d959b2d484b5a6a.jpg)
我想实现一个对角矩阵应用函数,它是通过首先提供对角线d,然后用x做一堆矩阵向量乘法而创建的.当然我不想创建一个实际的矩阵,因为所需要的只是元素向量乘法.
现在,一些用户将提供形状(k,)的对角线d,一些形状(k,1).此外,x可以具有形状(k,)和(k,1).我希望apply()方法的行为与numpy矩阵的*一样,结果与输入x的形状相同.
因此问题是:在Python / Numpy中,是否有一种非常不经常的方法来元素乘法两个np.arrays x和y形状(k,)或(k,1)(任意组合),以便得到的数组具有x的形状?
我用[:,None]做了一点实验,
x = np.empty((4,1))
y = np.empty(4)
(x * y).shape # (4,4) -- nope
(y * y).shape # (4,) -- yes
(x * y[:,None]).shape # (4, 1) -- yes
(y * y[:,None]).shape # (4,4) -- nope
如果len(x.shape)== …:,我当然可以将我的代码包装起来,但这并不是非常pythonic.
建议?
解决方法:
既然我理解了你的问题,我的建议只是重塑.调用reshape返回一个视图,因此它不会产生任何大的复制成本或类似的东西.只需重新整形数组,再乘以重新整形:
>>> def shape_preserving_mult(x, y):
... return (x.reshape((-1,)) * y.reshape((-1))).reshape(x.shape)
...
或者更简洁,正如你和rroowwllaanndd指出的那样:
>>> def shape_preserving_mult(x, y):
... return x * y.reshape(x.shape)
...
>>> shape_preserving_mult(x, y)
array([[ 0],
[ 1],
[ 4],
[ 9],
[16]])
>>> shape_preserving_mult(x, y.T)
array([[ 0],
[ 1],
[ 4],
[ 9],
[16]])
>>> shape_preserving_mult(x.T, y)
array([[ 0, 1, 4, 9, 16]])
>>> shape_preserving_mult(x.T, y.T)
array([[ 0, 1, 4, 9, 16]])
我之前建议的内容仍然如下.
值得注意的是,如果你将一个形状(1,4)的numpy数组与一个形状(4,)数组相乘,你会得到一些接近你想要的东西.
>>> x = numpy.arange(5).reshape((5, 1))
>>> y = numpy.arange(5)
>>> x.shape
(5, 1)
>>> x.T.shape
(1, 5)
>>> y * x.T
array([[ 0, 1, 4, 9, 16]])
这不具有a的形状,但它具有a.T.的形状.你总是可以再次在结果上调用T.这也适用于shape(5,)数组,因为1-d数组上的转置操作不会导致任何变化.所以也许你可以这样做:
>>> def transposed_mult(x, y):
... return (x.T * y).T
...
>>> transposed_mult(x, y)
array([[ 0],
[ 1],
[ 4],
[ 9],
[16]])
但是,如果你传递一个形状数组(1,5),这当然会导致相反的问题:
>>> transposed_mult(x.T, y)
array([[ 0, 0, 0, 0, 0],
[ 0, 1, 2, 3, 4],
[ 0, 2, 4, 6, 8],
[ 0, 3, 6, 9, 12],
[ 0, 4, 8, 12, 16]])
所以transposed_mult确实是你在原帖中要求的,但是如果你需要任何进一步的灵活性,它将无法按预期工作.事实上,您似乎需要额外的灵活性.
内容总结
以上是互联网集市为您收集整理的python – Elementwise乘以1D-numpy数组(形状(k,1)或(k,))并且结果具有第一个的形状全部内容,希望文章能够帮你解决python – Elementwise乘以1D-numpy数组(形状(k,1)或(k,))并且结果具有第一个的形状所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。