我的模块定义如下所示:
module RG::Stats
def self.sum(a, args = {})
a.inject(0){ |accum, i| accum + i }
end
end
Run Code Online (Sandbox Code Playgroud)
要使用此方法,我只需要包含此定义的文件,以便我可以执行以下操作:
RG::Stats.sum(array)
Run Code Online (Sandbox Code Playgroud)
并且
RG::Stats.method(:sum)
Run Code Online (Sandbox Code Playgroud)
但是,如果我需要知道使用的方法列表,RG::Stats.instance_methods我会获得一个空数组.这是因为我用过self.如果我省略self然后RG::Stats.instance_methods给出方法列表,但我不能再访问它们了.
问题是:如何self在模块的方法定义中使用?
我有以下DataFrame(提取)
data = pd.DataFrame([[0., -10.88948939, 74.22099994, 1.5, "NW", 0], [0.819377018, -10.88948939, 74.22099994, 1.5, "NW", 1], [8.47965933, -10.88948939, 74.22099994, 1.5, "NW", 10], [15.38036833, -10.88948939, 74.22099994, 1.5, "NW", 20]], columns=["Velocity", "X", "Y", "Z", "wind_direction", "wind_speed"])
Velocity X Y Z wind_direction wind_speed
0 -10.88 74.22 1.5 NW 0
0.82 -10.89 74.22 1.5 NW 1
8.48 -10.89 74.22 1.5 NW 10
15.38 -10.89 74.22 1.5 NW 20
Run Code Online (Sandbox Code Playgroud)
它表示特定坐标(X,Y,Z)和两个边界条件(wind_direction和wind_speed)的CFD模拟结果.
我想估计相同点(X,Y,Z)的速度,相同的wind_direction,但是中间wind_speed,比如4.6.我的数据框中有这个额外的行
NaN -10.89 74.22 1.5 NW 4.6
Run Code Online (Sandbox Code Playgroud)
现在我想基于wind_speed进行插值以填充NaN.对于上面的例子,我希望得到6.643773541
数字来自线性插值:
0.82 +(4.6 - 1)/(10 - 1)*(8.48 - …
如果我有一个这样的数组:
inner_loop =
[
[
[18, 119], [42, 119], [42, 95], [18, 95]
],
[
[80, 96], [80, 75], [59, 75], [59, 96]
]
]
Run Code Online (Sandbox Code Playgroud)
我如何将其转换为多维元组
(
(
(18, 119), (42, 119), (42, 95), (18, 95)
),
(
(80, 96), (80, 75), (59, 75), (59, 96)
)
)
Run Code Online (Sandbox Code Playgroud)
我试过了:
tuple(tuple(y) for y in (tuple(tuple (x) for x in (tuple(inner_loops)))))
Run Code Online (Sandbox Code Playgroud)
但最后一级没有转换.
我试图以lambda编程方式生成.这是一个例子:
这是我需要生成的矩阵:
m = [[a(t), b(t)],
[c(t), d(t)]]
Run Code Online (Sandbox Code Playgroud)
这是一个依赖于时间的矩阵.如果a,b,c,d功能总是我将创建一个这样的拉姆达相同:
m = lambda{|t| [[a(t), b(t)], [c(t), d(t)]]}
Run Code Online (Sandbox Code Playgroud)
并称之为:
m.call(x)
Run Code Online (Sandbox Code Playgroud)
这些功能并不完全通用,但它们只能来自有限的列表.问题是我不知道在执行某些计算之前,从这个列表中可以看出哪些功能.在我的例子中,例如,我只有三个可能的函数,所以lambda可以是:
m = lambda{|t| [[f1(t), f2(t)], [f2(t), f3(t)]]}
Run Code Online (Sandbox Code Playgroud)
要么
m = lambda{|t| [[f3(t), f3(t)], [f1(t), f2(t)]]}
Run Code Online (Sandbox Code Playgroud)
或三种功能的任何其他组合.
有没有办法以lambdas编程方式定义?这是最好的方法吗?
在实际代码中,这个矩阵可能非常大,容易500x10,000(500,000)个元素.它在第一个循环中计算.之后循环遍历t值.对于每个t功能当然不会改变.此外,这些函数是简单的数学表达式,如power,exp等...
我想将我的凭据存储在环境变量中~/.aws/credentials而不是存储在环境变量中,但我正在努力。
加载我使用的凭据(从此处)
credentials = Aws::SharedCredentials.new({region: 'myregion', profile_name: 'myprofile'})
Run Code Online (Sandbox Code Playgroud)
我的~/.aws/credentials是
[myprofile]
AWS_ACCESS_KEY = XXXXXXXXXXXXXXXXXXX
AWS_SECRET_KEY = YYYYYYYYYYYYYYYYYYYYYYYYYYY
Run Code Online (Sandbox Code Playgroud)
我的~/.aws/config是
[myprofile]
output = json
region = myregion
Run Code Online (Sandbox Code Playgroud)
然后我定义一个资源
aws = Aws::EC2::Resource.new(region: 'eu....', credentials: credentials)
Run Code Online (Sandbox Code Playgroud)
但如果我尝试例如
aws.instances.first
Run Code Online (Sandbox Code Playgroud)
我收到错误Error: #<Aws::Errors::MissingCredentialsError: unable to sign request without credentials set>
如果我对密钥进行硬编码,一切都会正常
在执行我的脚本期间,我需要将一个大文件写入磁盘以存储部分计算.这个文件很大,其余的脚本不需要它.目前,我需要等待写入完成才能继续执行脚本.
有没有办法在后台编写文件?有点像启动一个单独的写入过程,而其余的脚本继续不受干扰?
我的对象包含一个实例变量,该变量指向其他几个属性中的 File 对象。因此Marshal无法序列化它。如何编写定制dump方法以便仅排除该实例变量?
class Area
attr_accessor :area
attr_reader :several_other_attributes
........
def initialize(name)
@area = name
@several_other_attributes = ....
@log = File.open( 'test.log', 'w')
end
end
Run Code Online (Sandbox Code Playgroud) ruby ×5
python ×2
amazon-iam ×1
arrays ×1
file-io ×1
lambda ×1
marshalling ×1
pandas ×1
self ×1
tuples ×1