2011-12-04 38 views
10

Sau khi sử dụng nó một lúc, tôi thực sự thích mảng đa chiều Numpy. Thật hữu ích khi viết các thuật toán với một mã súc tích nhưng có thể đọc được và khá chung chung. Tôi muốn có điều tương tự trong Java. Trước khi viết một mảng đa chiều với một API giống như Numpy, có một thứ như vậy không?Java tương đương với đối tượng đa chiều Numpy

[PS] Tôi đã tìm kiếm một chút, không thấy

+1

Nếu bạn đang đề cập đến nền tảng Java * *, [Scalala] (https://github.com/scalala/Scalala) trông giống như một ứng cử viên tốt ... –

Trả lời

4

Vì vậy, trận đấu gần nhất có vẻ là Colt! http://acs.lbl.gov/software/colt/

Nó có đối tượng mảng đa chiều, chế độ xem trên một mảng và đại số tuyến tính thông thường của bạn! Và nó có vẻ khá hiệu quả.

+3

Bạn có thể trả lời, lớp Colt nào đại diện cho mảng đa chiều không? – Dims

+0

@Xác định giao diện cho các mảng đa chiều là AbstractMatrix http://dst.lbl.gov/ACSSoftware/colt/api/cern/colt/matrix/impl/AbstractMatrix.html. Các triển khai được cung cấp trong Colt chỉ bao gồm các trường hợp 1, 2 và 3 chiều. – dlegland

1

Bạn có thể sử dụng thư viện số cho đại số tuyến tính; những người sẽ có ma trận trong họ. Hãy xem Apache Commons Math.

+1

Tôi biết thư viện đó. API là một 'véc tơ & ma trận' cổ điển. Tôi đang tìm kiếm một với một Numpy như một, cung cấp mảng đa chiều, thống nhất vectơ và ma trận là một thực thể. Cách tiếp cận như vậy, dựa trên kinh nghiệm cá nhân, hóa ra làm cho nhiều mã toán dễ viết hơn. – Monkey

+0

Vectorz (xem câu trả lời của tôi) cung cấp các mảng đa chiều tùy ý với một giao diện trừu tượng duy nhất (INDArray) được thực hiện bởi cả vectơ và ma trận – mikera

0

Tôi có thể nói rằng java không có thứ gì giống như 'numpy'. numpy là một dự án định hướng toán học lớn mà không thực sự phù hợp trong tâm lý java.

Nó không quan tâm rằng không có thư viện thu thập tốt trong java! Ổi có giao diện Table với hai cài đặt tốt, ArrayTableHashBasedTable. Đó là một thư viện bộ sưu tập mà một công cụ toán học nhưng nó rất hữu ích.

Để đạt hiệu quả về tốc độ và bộ nhớ, điện áp là trove. Một thư viện bộ sưu tập hoạt động với các nguyên thủy.

Đối với hoạt động maticies, JAMA có vẻ tốt.

Theo như tôi biết, bạn sẽ cần viết mã nhiều hơn và sử dụng nhiều thư viện hơn trong java so với python.

3

Thư viện Vectorz (https://github.com/mikera/vectorz) cung cấp một NDArray đầy đủ tính năng đó là một cách rộng rãi tương đương trong chức năng để NDArray NumPy của, tức là nó cung cấp các tính năng fullowing:

  • Arbitrary mảng N-chiều của giá trị số (trong trường hợp này, Java tăng gấp đôi)
  • Chế độ xem nhẹ sử dụng truy cập có độ phân giải để cắt hiệu quả
  • Một phạm vi rộng của mathem atical hoạt động với việc triển khai effiecient

Nó cũng rất nhanh: nó là nhanh hơn nhiều sau đó NumPy cho hầu hết các hoạt động, mặc dù NumPy vẫn có thể nhanh hơn đối với một số hoạt động ma trận lớn vì nó sử dụng BLAS thư viện bản địa để tăng tốc những cái này

Đây là lớp NDArray bản thân:

https://github.com/mikera/vectorz/blob/develop/src/main/java/mikera/arrayz/NDArray.java

Disclaimer: Tôi là tác giả của Vectorz

+0

Numpy có thể được biên dịch với hỗ trợ BLAS gốc, ví dụ: OpenBlas hoặc ATLAS. Vectorz tận dụng lợi thế của một số thư viện đại số tuyến tính được tối ưu hóa? – mariolpantunes

+0

Vectorz không hỗ trợ thư viện gốc - được thiết kế cố tình để mã thuần JVM. Có các thư viện Java khác (ví dụ: MTJ, JBlas) có thể sử dụng BLAS. – mikera

+0

Xin chào Mike. Tôi thấy Vectorz rất hấp dẫn đối với tôi. Tôi đang làm việc trên chuyển đổi định dạng màu sắc từ RGB sang HSL trong thời gian thực và nghĩ rằng Vectorz chính xác những gì tôi cần. Có thể áp dụng một số biểu thức toán học cho mọi phần tử trong ma trận theo cách hiệu quả không? Giả sử rằng một ma trận là một đại diện của khung máy ảnh duy nhất, cho phép nói mảng 2D. –

2

Scala có một số lớn hơn của các thư viện NumPy giống như, nếu mà đếm. (Bạn thậm chí có thể sử dụng chúng từ Java.)

BIDMat hứa hẹn sẽ vừa mạnh mẽ vừa nhanh (và có GPU).

Như đã đề cập, đó cũng là Breeze

6

Các OP là từ năm 2011. Vì vậy, tính đến cuối năm 2015 tôi muốn đề cập đến rằng có một đứa trẻ mới trong thị trấn mà tuyên bố là NumPy cho java ->nd4j . Điều tuyệt vời là nd4j là một lớp trừu tượng trên các thư viện khác nhau như blas. Tùy thuộc vào kích thước của ma trận của bạn, có hai lần triển khai cơ bản hai lần là fast dưới dạng khối u hoặc jblas. Và mã của bạn là nền tảng thực sự độc lập.

1

Một tùy chọn tuyệt vời khác là sử dụng API DataFrame của Spark.

http://spark.apache.org/docs/latest/sql-programming-guide.html

này mang đến cho bạn một Pandas/NumPy như giao diện để mảng trong Java. Thêm vào đó mã vốn có thể song song và có thể chạy trên một cụm máy nếu kích thước dữ liệu của bạn tăng lên.

Các vấn đề liên quan