我是Python的新手,我一直面临着一个问题,我无法在stackoverflow上找到直接的答案(但我想我只是没有足够的经验来谷歌正确的条款)。我希望你能帮忙
考虑一下:
import numpy as np
class Data:
def __init__(self, data):
self.data = data
def get_dimensions(self):
return np.shape(self.data)
test = Data(np.random.random((20, 15)))
print(test.get_dimensions())
这给了我
(20, 15)
就像我想要的那样。
现在这就是我想做的事情: 在我的数据处理过程中,我需要经常获取数据集的形状,尤其是在类本身中。但是,我不想每次都打电话给numpy
self.get_dimensions()
因为我认为这总是会通过分析数组的过程。有没有办法只计算一次形状变量,然后在类中共享它,这样可以节省计算时间?
我的问题更复杂,因为我需要首先打开文件,阅读它们并从中获取数据的形状,所以我真的想避免每次想要获得形状时这样做...... / p>
我希望你能看到我的问题 谢谢!!
编辑:
我的问题已经得到解答,但我想问一个跟进问题是否也有效:
import numpy as np
class Data:
def __init__(self, data):
self.data = data
self.dimensions = self._get_dimensions()
def _get_dimensions(self):
return np.shape(self.data)
test = Data(np.random.random((20, 15)))
print(test.dimensions)
我问这个问题,因为根据你们所描述的方法,我必须在某个地方至少计算一次,然后才能得到尺寸。这种方式是否也总是通过计算过程,或只存储一次?
再次感谢!
答案 0 :(得分:2)
您可以将结果缓存为成员变量(如果我正确理解了问题):
import numpy as np
class Data:
def __init__(self, data):
self.data = data
self.result = None
def get_dimensions(self):
if not self.result:
self.result = np.shape(self.data)
return self.result
test = Data(np.random.random((20, 15)))
print(test.get_dimensions())
答案 1 :(得分:2)
当然,你可以这样做:
class Data:
def __init__(self, data):
self.data = data
self.dimensions = None
def get_dimensions(self):
self.dimensions = (np.shape(self.data) if
self.dimensions is None else
self.dimensions)
return self.dimensions
如果您需要修改self.data
并重新计算self.dimensions
,可以使用关键字参数更好地为您提供服务,以指定是否要重新计算结果。例如:
def get_dimensions(self, calculate=False):
self.dimensions = (np.shape(self.data)
if calculate or self.dimensions is None
else self.dimensions)
return self.dimensions
答案 2 :(得分:2)
数组的形状直接存储在数组中,而不是计算值。阵列的形状必须存储为后备存储器是平面阵列。因此(4, 4)
,(2, 8)
和(16,)
将具有相同的后备数组。在不存储形状的情况下,阵列无法执行索引操作。 numpy.shape
仅对获取类数组对象(如列表或元组)的形状非常有用。
shape = self.data.shape
我错过了最后一点你关心的其他一些你没有展示过的昂贵计算。最好的解决方案是第一次缓存计算值,并在以后的方法调用中返回缓存值。 为了应对额外的计算
from random import random
class Data:
@property
def dimensions(self):
# Do a try/except block as the exception will only every be thrown the first
# time. Secondary invocations will work quicker and not require any checking.
try:
return self._dimensions
except AttributeError:
pass
# some complex computation
self._dimensions = random()
return self._dimensions
d = Data()
assert d.dimensions == d.dimensions
答案 3 :(得分:0)
如果您的尺寸没有变化,您可以更简单。
import numpy as np
class Data:
def __init__(self, data):
self.data = data
self.dimension=np.shape(self.data)
def get_dimensions(self):
return self.dimension
test = Data(np.random.random((20, 15)))
print(test.get_dimensions())