对于相当于Numpy多维对象的Java感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解numpy多维数组,并且为您提供关于C#中的Java枚举相当于什么?、DJL之Java玩转多维数组,就像
对于相当于Numpy多维对象的Java感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解numpy多维数组,并且为您提供关于C#中的Java枚举相当于什么?、DJL 之 Java 玩转多维数组,就像 NumPy 一样、Groovy或Java相当于sumproduct?、javascript – 使用多维数组创建多维对象的宝贵知识。
本文目录一览:- 相当于Numpy多维对象的Java(numpy多维数组)
- C#中的Java枚举相当于什么?
- DJL 之 Java 玩转多维数组,就像 NumPy 一样
- Groovy或Java相当于sumproduct?
- javascript – 使用多维数组创建多维对象
相当于Numpy多维对象的Java(numpy多维数组)
使用一段时间后,我真的很喜欢Numpy多维数组。用简洁而易读且相当通用的代码编写算法会很有帮助。我希望在Java中也有同样的事情。在自己使用类似Numpy的API编写多维数组之前,已经有这样的东西吗?
[PS]我搜索了一下,没看到
答案1
小编典典因此,最接近的比赛似乎是柯尔特!http://acs.lbl.gov/software/colt/
它具有多维数组对象,数组视图和通常的线性代数!而且似乎效率很高。
C#中的Java枚举相当于什么?
C#中的Java枚举相当于什么?
答案1
小编典典完整的Java枚举功能在C#中不可用。你可以来 合理地 接近使用嵌套类型和私有构造虽然。例如:
using System;using System.Collections.Generic;using System.Xml.Linq;public abstract class Operator{ public static readonly Operator Plus = new PlusOperator(); public static readonly Operator Minus = new GenericOperator((x, y) => x - y); public static readonly Operator Times = new GenericOperator((x, y) => x * y); public static readonly Operator Divide = new GenericOperator((x, y) => x / y); // Prevent other top-level types from instantiating private Operator() { } public abstract int Execute(int left, int right); private class PlusOperator : Operator { public override int Execute(int left, int right) { return left + right; } } private class GenericOperator : Operator { private readonly Func<int, int, int> op; internal GenericOperator(Func<int, int, int> op) { this.op = op; } public override int Execute(int left, int right) { return op(left, right); } }}
当然你不 具备
使用嵌套类型,但他们给了方便的“自定义的行为”其中一部分的Java枚举是好的。在其他情况下,您可以仅将参数传递给私有构造函数以获取众所周知的受限值集。
一些不能给您的事情:
- 顺序支持
- 开关支持
EnumSet
- 序列化/反序列化(作为单例)
尽管没有黑客,切换实际上是不可行的,但其中的一些工作可能需要付出足够的努力。现在,如果该 语言
做了类似的事情,它可以通过使黑客自动操作(例如自动声明const
字段负载,并将枚举类型的任何切换更改为整数的切换,仅允许“ “案例。)
哦,部分类型意味着您不必在同一个文件中包含 所有 枚举值。如果每个值都涉及到(这绝对是可能的),则每个值都有自己的文件。
DJL 之 Java 玩转多维数组,就像 NumPy 一样
本文适合有 Java 基础的人群
HelloGitHub 推出的《讲解开源项目》系列。有幸邀请到了亚马逊 + Apache 的工程师:Lanking( https://github.com/lanking520 ),为我们讲解 DJL —— 完全由 Java 构建的深度学习平台,本文为系列的第二篇。
一、前言
随着数据科学在生产中的应用逐步增加,使用 N维数组 灵活的表达数据变得愈发重要。我们可以将过去数据科学运算中的多维循环嵌套运算简化为简单几行。由于进一步释放了计算并行能力,这几行简单的代码运算速度也会比传统多维循环快很多。
这种数学计算的包已经成为数据科学、图形学以及机器学习领域的标准。同时它的影响力还在不断的扩大到其他领域。
在 Python 的世界,调用 NDArray(N维数组)的标准包叫做 NumPy。但是如今在 Java 领域中,并没有与之同样标准的库。为了给 Java 开发者创造同一种使用环境,亚马逊云服务开源了 DJL 一个基于 Java 的深度学习库。
尽管它包含了深度学习模块,但是它最核心的 NDArray 系统可以被用作 N维数组 的标准。它具备优良的可扩展性、全平台支持以及强大的后端引擎支持 (TensorFlow、PyTorch、Apache MXNet)。无论是 CPU 还是 GPU、PC 还是安卓,DJL 都可以轻而易举的完成任务。
项目地址:https://github.com/awslabs/djl/
在这个文章中,我们将带你了解 NDArray,并且教你如何写与 Numpy 同样简单的 Java 代码以及如何将 NDArray 使用在现实中的应用之中。
二、安装 DJL
可以通过下方的配置来配置你的 gradle 项目。或者你也可以跳过设置直接使用我们在线 JShell 。
在线 JShell 链接: https://djl.ai/website/demo.html#jshell
plugins {
id ''java''
}
repositories {
jcenter()
}
dependencies {
implementation "ai.djl:api:0.6.0"
// PyTorch
runtimeOnly "ai.djl.pytorch:pytorch-engine:0.6.0"
runtimeOnly "ai.djl.pytorch:pytorch-native-auto:1.5.0"
}
然后,我们就可以开始上手写代码了。
三、基本操作
我们首先尝试建立一个 try block 来包含我们的代码(如果使用在线 JShell 可跳过此步):
try(NDManager manager = NDManager.newBaseManager()) {
}
NDManager 是 DJL 中的一个 class 可以帮助管理 NDArray 的内存使用。通过创建 NDManager 我们可以更及时的对内存进行清理。当这个 block 里的任务运行完成时,内部产生的 NDArray 都会被清理掉。这个设计保证了我们在大规模使用 NDArray 的过程中,可以通过清理其中的 NDManager 来更高效的利用内存。
为了做对比,我们可以参考 NumPy 在 Python 之中的应用。
import numpy as np
3.1 创建 NDArray
ones
是一个创建全是1的N维数组操作.
Python (Numpy)
nd = np.ones((2, 3))
"""
[[1. 1. 1.]
[1. 1. 1.]]
"""
Java (DJL NDArray)
NDArray nd = manager.ones(new Shape(2, 3));
/*
ND: (2, 3) cpu() float32
[[1., 1., 1.],
[1., 1., 1.],
]
*/
你也可以尝试生成随机数。比如我们需要生成一些从 0 到 1 的随机数:
Python (Numpy)
nd = np.random.uniform(0, 1, (1, 1, 4))
# [[[0.7034806 0.85115891 0.63903668 0.39386125]]]
Java (DJL NDArray)
NDArray nd = manager.randomUniform(0, 1, new Shape(1, 1, 4));
/*
ND: (1, 1, 4) cpu() float32
[[[0.932 , 0.7686, 0.2031, 0.7468],
],
]
*/
这只是简单演示一些常用功能。现在 NDManager 支持多达 20 种在 NumPy 中 NDArray 创建的方法。
3.2 数学运算
你可以使用 NDArray 进行一系列的数学操作。假设你想做对数据做一个转置操作,然后对所有数据加一个数的操作。你可以参考如下的实现:
Python (Numpy)
nd = np.arange(1, 10).reshape(3, 3)
nd = nd.transpose()
nd = nd + 10
"""
[[11 14 17]
[12 15 18]
[13 16 19]]
"""
Java (DJL NDArray)
NDArray nd = manager.arange(1, 10).reshape(3, 3);
nd = nd.transpose();
nd = nd.add(10);
/*
ND: (3, 3) cpu() int32
[[11, 14, 17],
[12, 15, 18],
[13, 16, 19],
]
*/
DJL 现在支持 60 多种不同的 NumPy 数学运算,基本涵盖了大部分的应用场景。
3.3 Get 和 Set
其中一个对于 NDArray 最重要的亮点就是它轻松简单的数据设置/获取功能。我们参考了 NumPy 的设计,将 Java 过去对于数据表达中的困难做了精简化处理。
假设我们想筛选一个N维数组所有小于10的数:
Python (Numpy)
nd = np.arange(5, 14)
nd = nd[nd >= 10]
# [10 11 12 13]
Java (DJL NDArray)
NDArray nd = manager.arange(5, 14);
nd = nd.get(nd.gte(10));
/*
ND: (4) cpu() int32
[10, 11, 12, 13]
*/
是不是非常简单?接下来,我们看一下一个稍微复杂一些的应用场景。假设我们现在有一个3x3的矩阵,然后我们想把第二列的数据都乘以2:
Python (Numpy)
nd = np.arange(1, 10).reshape(3, 3)
nd[:, 1] *= 2
"""
[[ 1 4 3]
[ 4 10 6]
[ 7 16 9]]
"""
Java (DJL NDArray)
NDArray nd = manager.arange(1, 10).reshape(3, 3);
nd.set(new NDIndex(":, 1"), array -> array.mul(2));
/*
ND: (3, 3) cpu() int32
[[ 1, 4, 3],
[ 4, 10, 6],
[ 7, 16, 9],
]
*/
在上面的案例中,我们在 Java 引入了一个 NDIndex 的 class。它复刻了大部分在 NumPy 中对于 NDArray 支持的 get/set 操作。只需要简单的放进去一个字符串表达式,开发者在 Java 中可以轻松玩转各种数组的操作。
四、现实中的应用场景
上述的操作对于庞大的数据集是十分有帮助的。现在我们来看一下这个应用场景:基于单词的分类系统训练。在这个场景中,开发者想要利用从用户中获取的数据来进行情感分析预测。
NDArray 被应用在了对于数据进行前后处理的工作中。
4.1 分词操作
在输入到 NDArray 数据前,我们需要对于输入的字符串进行分词操作并编码成数字。下面代码中看到的 tokenizer 是一个 Map<String, Integer>
,它是一个单词到字典位置的映射。
String text = "The rabbit cross the street and kick the fox";
String[] tokens = text.toLowerCase().split(" ");
int[] vector = new int[tokens.length];
/*
String[9] { "the", "rabbit", "cross", "the", "street",
"and", "kick", "the", "fox" }
*/
for (int i = 0; i < tokens.length; i++) {
vector[i] = tokenizer.get(tokens[i]);
}
vector
/*
int[9] { 1, 6, 5, 1, 3, 2, 8, 1, 12 }
*/
4.2 NDArray 处理
经过了编码操作后,我们创建了 NDArray 之后,我们需要转化数据的结构:
NDArray array = manager.create(vector);
array = array.reshape(new Shape(vector.length, 1)); // form a batch
array = array.div(10.0);
/*
ND: (9, 1) cpu() float64
[[0.1],
[0.6],
[0.5],
[0.1],
[0.3],
[0.2],
[0.8],
[0.1],
[1.2],
]
*/
最后,我们将数据传入深度学习模型中。如果使用 Java 要达到这些需要更多的工作量:如果我们需要实现类似于 reshape 的方法,我们需要创建一个N维数组:List<List<List<...List<Float>...>>>
来保证不同维度的可操作性。同时我们需要能够支持插入新的 List<Float>
来创建最终的数据格式。
五、NDArray 的实现过程
你也许会好奇 NDArray 究竟是如何在 DJL 之中构建的呢?接下来,我们会讲解一下 NDArray 在 DJL 内部中的架构。架构图如下:
如上图所示 NDArray 有三个关键的层。
界面层 (Interface) 包含了你所用到的 NDArray ,它只是一个 Java 的界面并定义了 NDArray 的输入输出结构。我们很仔细的分析了每一个方式的使用方法以便尽可能的将它们和用户的应用场景统一以及便于使用。
在引擎提供者层 (EngineProvider),是 DJL 各种深度学习引擎为 NDArray 界面开发的包。这个层把原生的深度学习引擎算子表达映射在 NumPy 之上。这样经过这样一层转译,我们在不同引擎上看到 NDArray 的表现都是一致的而且同时兼顾了 NumPy 的表现。
在 C++ 层,为了更便于 Java 使用,我们构建了 JNI 和 JNA 暴露出 C/C++ 的等方法,它可以保证我们有足够的方法来构建 NDArray 所需要的功能。同时 C++ 与 Java 的直接调用也可以保证 NDArray 拥有最好的性能。
六、为什么应该使用 NDArray 呢?
经过了这个教程,你应该获得了基本的 NDArray 在 Java 中的使用体验。但是这仍然只是表象,它的很多内在价值只有在生产环境中才能体现出来。总结一下 NDArray 具有如下几个优点:
- 易如反掌:轻松使用超过 60+ 个在 Java 中的方式实现与 NumPy 相同的结果。
- 快如闪电:具备各路深度学习框架加持,DJL NDArray 具备了各种硬件平台的加速,比如在 CPU 上的 MKLDNN 加速以及 GPU 上的 CUDA 加速,无论多大的数据集都可以轻松应对。
- 深度学习:同时具备高维数组、离散数组支持。你可以轻松的将 DJL 与其他大数据或者流数据平台结合起来应用:比如分布式处理的 Apache Spark 平台以及 Apache Flink 流数据平台。为你现有的方案构建一层深度学习的中间件。
NDArray 的到来帮助 DJL 成功转变为 Java 在深度学习领域中最好的工具。它具备平台自检测机制,无需任何额外设置,便可以在应用中构建基于 CPU/GPU 的代码。感兴趣的小伙伴快跟着教程感受下吧!
更多详情尽在 NDArray 文档:https://javadoc.io/doc/ai.djl/api/latest/ai/djl/ndarray/NDArray.html
关于 DJL
Deep Java Library (DJL) 是一个基于 Java 的深度学习框架,同时支持训练以及推理。 DJL 博取众长,构建在多个深度学习框架之上 (TenserFlow、PyTorch、MXNet 等) 也同时具备多个框架的优良特性。你可以轻松使用 DJL 来进行训练然后部署你的模型。
它同时拥有着强大的模型库支持:只需一行便可以轻松读取各种预训练的模型。现在 DJL 的模型库同时支持高达 70 个来自 GluonCV、 HuggingFace、TorchHub 以及 Keras 的模型。
项目地址:https://github.com/awslabs/djl/
在最新的版本中 DJL 0.6.0 添加了对于 MXNet 1.7.0、PyTorch 1.5.0、TensorFlow 2.2.0 的支持。我们同时也添加了 ONNXRuntime 以及 PyTorch 在安卓平台的支持。
关注 HelloGitHub 公众号
本文分享 CNBlog - 削微寒的程序员之路。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
Groovy或Java相当于sumproduct?
sumproduct的准语法是这样的
def list1 = [2,3,4] def list2 = [5,10,20] SUMPRODUCT(list1,list2 ...) = 120
你会得到120((2 * 5)(3 * 10)(4 * 20)= 120)
解决方法
def list1 = [2,20] assert [list1,list2] .transpose() .collect { it[0] * it[1] } .sum() == 120
javascript – 使用多维数组创建多维对象
我试图建立一个有点先进的“Flot”jQuery插图.为此,我需要一个多维对象(或者至少我认为它是).
结构应如下所示:
var datasets = {
"usa": {
label: "USA",
data: [[1988, 483994], [1989, 479060], [1990, 457648], [1991, 401949], [1992, 424705], [1993, 402375], [1994, 377867], [1995, 357382], [1996, 337946], [1997, 336185], [1998, 328611], [1999, 329421], [2000, 342172], [2001, 344932], [2002, 387303], [2003, 440813], [2004, 480451], [2005, 504638], [2006, 528692]]
},
"russia": {
label: "Russia",
data: [[1988, 218000], [1989, 203000], [1990, 171000], [1992, 42500], [1993, 37600], [1994, 36600], [1995, 21700], [1996, 19200], [1997, 21300], [1998, 13600], [1999, 14000], [2000, 19100], [2001, 21300], [2002, 23600], [2003, 25100], [2004, 26100], [2005, 31100], [2006, 34700]]
}
};
从我的代码隐藏中我生成了一些看起来像这样的列表(不是相同的数据,但不介意):
<ul id="MOBILISATION">
<li data-key="2012/3/27">02:10</li>
<li data-key="2012/3/28">05:25</li>
<li data-key="2012/3/29">09:21</li>
<li data-key="2012/3/30">00:00</li>
<li data-key="2012/3/31">00:00</li>
</ul>
<ul id="OPERATIONS">
<li data-key="2012/3/27">19:51</li>
<li data-key="2012/3/28">18:35</li>
<li data-key="2012/3/29">14:39</li>
<li data-key="2012/3/30">07:46</li>
<li data-key="2012/3/31">10:26</li>
</ul>
“USA / usa”是“MOBILIZATION”,“1988”是“2012/3/27”,“483994”是“02:10”.你得到图片!! ??
我试过写一些jQuery,但它显然不起作用:
var objects = [];
var array = [];
var categoryName = "";
$('div#Container ul').each(function () {
catName = $(this).attr('id');
$('li', this).each(function () {
array.push([new Date($(this).data('key')).getTime(), $(this).text()]);
});
objects.push({ categoryName: { label: categoryName, data: array} });
});
var datasets = objects;
正如你所看到的,我已经使用了push to objects数组.显然那不是我想要的结果.我是kindda在这里上下都失败了,这是我第一次使用javascript / jQuery对象.
什么是最好的解决方案?
解决方法:
您的数据集是一个对象,而不是一个数组 – 您无法推送它.此外,您的变量categoryName不起作用(在dot and bracket notation上阅读更多内容).尝试这个:
var datasets = {};
$('div#Container ul').each(function () {
catName = this.id;
var array = [];
$('li', this).each(function () {
array.push([
new Date($(this).data('key')).getTime(),
$(this).text()
]);
});
datasets[catName.toLowercase()] = {
label: catName.touppercase(),
data: array
};
});
另外,我不确定你是否真的需要创建Date对象,但这取决于你的输入和输出格式.
关于相当于Numpy多维对象的Java和numpy多维数组的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于C#中的Java枚举相当于什么?、DJL 之 Java 玩转多维数组,就像 NumPy 一样、Groovy或Java相当于sumproduct?、javascript – 使用多维数组创建多维对象的相关信息,请在本站寻找。
本文标签: