python – 设置属性和调用就地变异方法之间的区别?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 设置属性和调用就地变异方法之间的区别?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2584字,纯文字阅读大概需要4分钟。
内容图文
![python – 设置属性和调用就地变异方法之间的区别?](/upload/InfoBanner/zyjiaocheng/785/187cd98db53545b89654343717615972.jpg)
我主要使用numpy进行数据分析,不了解底层程序,所以这可能是显而易见的.
我不明白通过简单地分配属性来设置属性与调用在原地更改该属性的方法之间的区别.你可以做到的两个例子是:
In [1]: import numpy as np
In [2]: a = np.array([[1, 2, 3],
...: [4, 5, 6]])
In [3]: a.shape
Out[3]: (2, 3)
In [4]: a.reshape(3,2)
Out[4]:
array([[1, 2],
[3, 4],
[5, 6]])
In [5]: a
Out[5]:
array([[1, 2, 3],
[4, 5, 6]])
In [6]: a.resize(3,2)
In [7]: a
Out[7]:
array([[1, 2],
[3, 4],
[5, 6]])
In [8]: a.shape = (6,)
In [9]: a
Out[9]: array([1, 2, 3, 4, 5, 6])
In [10]: a.__setattr__('shape',(3,2))
In [11]: a
Out[11]:
array([[1, 2],
[3, 4],
[5, 6]])
我不明白输入6和8之间的区别.显然,两者都改变??了a.shape属性,而不是像4中那样返回重新整形的对象.它们都只调用.__ setattr __(),如同10?如果是这样,为什么它们都存在?
(我知道a.resize()有额外的容量可以增加或减少分配的内存,但是我没有在这里使用它 – 这种双重性是否仅存在,并且该方法增加了一些其他容量?)
解决方法:
我现在已多次阅读你的问题,并认为我可以解决所有问题:
a.reshape(3,2)
# returns a new array
a.resize(3,2)
# returns None, operates on the same array
# (equivalent to modifying ndarray.shape here since no. of elements is unchanged)
a.shape = (6,)
# operates on the same array, uses property trick to hide detailed
# setter logic behind normal attribute access.
# note the parens are unnecessary here - equivalent is a.shape = 6,
# NOT equivalent to a = a.reshape(6,), which would change the id(a)
a.__setattr__('shape',(3,2))
# just an ugly way of doing a.shape = 3,2
您的主要问题似乎是关于改变阵列形状的方法的非唯一性.
Clearly both change the a.shape attribute in place, as opposed to returning the reshaped object as in 4
是.或者更准确地说,两者都在适当的位置更改数组(并且因此修改形状“属性”返回的值).
Do they both only call on
a.__setattr__()
as in 10?
他们不一定要调用.__ setattr __(…).他们可以改变一些内部self._shape变量,它仍然可以改变a.shape返回的内容.
您可以通过创建自己的类来查看实际使用__setattr__的人,例如:
class my_ndarray(np.ndarray):
def __setattr__(self, name, value):
print '__setattr__ called with name={}, value={}'.format(name, value)
super(my_ndarray, self).__setattr__(name, value)
a_ = my_ndarray(a.shape)
a_[:] = a
在这种情况下,答案是a_.resize和a_.reshape都不使用__setattr__.
If so, why do they both exist?
当元素数量不同时,调整大小可以做的不仅仅是重塑,这对我来说是足够的理由.当你需要做的就是使用reshape时,使用resize会很奇怪,但是为什么numpy(应该是高性能的)在你“可能”使用reshape时要么警告你或者人为地限制你使用resize代替?
如果你担心明显违反了Python#13的禅宗,那么numpy并不是寻找一致性的最佳地方.例如,只需比较np.eye和np.identity!什么是numpythonic并不总是pythonic.
内容总结
以上是互联网集市为您收集整理的python – 设置属性和调用就地变异方法之间的区别?全部内容,希望文章能够帮你解决python – 设置属性和调用就地变异方法之间的区别?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。