Skip to content

Commit 057f6b8

Browse files
committed
Merge branch 'master' into nonzero
2 parents 8d261c2 + be3b74f commit 057f6b8

16 files changed

+75
-67
lines changed

benches/higher-order.rs

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
clippy::many_single_char_names
77
)]
88
extern crate test;
9+
use std::iter::FromIterator;
910
use test::black_box;
1011
use test::Bencher;
1112

blas-tests/tests/oper.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use ndarray::linalg::general_mat_vec_mul;
88
use ndarray::prelude::*;
99
use ndarray::{Data, LinalgScalar};
1010
use ndarray::{Ix, Ixs, SliceInfo, SliceOrIndex};
11+
use std::iter::FromIterator;
1112

1213
use approx::{assert_abs_diff_eq, assert_relative_eq};
1314
use defmac::defmac;
@@ -289,7 +290,7 @@ fn mat_mul_broadcast() {
289290
let (m, n, k) = (16, 16, 16);
290291
let a = range_mat(m, n);
291292
let x1 = 1.;
292-
let x = Array::from_vec(vec![x1]);
293+
let x = Array::from(vec![x1]);
293294
let b0 = x.broadcast((n, k)).unwrap();
294295
let b1 = Array::from_elem(n, x1);
295296
let b1 = b1.broadcast((n, k)).unwrap();

examples/life.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
extern crate ndarray;
88

99
use ndarray::prelude::*;
10+
use std::iter::FromIterator;
1011

11-
const INPUT: &[u8] = include_bytes!("life.txt");
12-
//const INPUT: &'static [u8] = include_bytes!("lifelite.txt");
12+
const INPUT: &'static [u8] = include_bytes!("life.txt");
1313

1414
const N: usize = 100;
15-
//const N: usize = 8;
1615

1716
type Board = Array2<u8>;
1817

src/arraytraits.rs

+38-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// except according to those terms.
88

99
use std::hash;
10+
use std::isize;
1011
use std::iter::FromIterator;
1112
use std::iter::IntoIterator;
1213
use std::mem;
@@ -119,15 +120,51 @@ where
119120
{
120121
}
121122

123+
impl<A, S> From<Vec<A>> for ArrayBase<S, Ix1>
124+
where
125+
S: DataOwned<Elem = A>,
126+
{
127+
/// Create a one-dimensional array from a vector (no copying needed).
128+
///
129+
/// **Panics** if the length is greater than `isize::MAX`.
130+
///
131+
/// ```rust
132+
/// use ndarray::Array;
133+
///
134+
/// let array = Array::from(vec![1., 2., 3., 4.]);
135+
/// ```
136+
fn from(v: Vec<A>) -> Self {
137+
if mem::size_of::<A>() == 0 {
138+
assert!(
139+
v.len() <= isize::MAX as usize,
140+
"Length must fit in `isize`.",
141+
);
142+
}
143+
unsafe { Self::from_shape_vec_unchecked(v.len() as Ix, v) }
144+
}
145+
}
146+
122147
impl<A, S> FromIterator<A> for ArrayBase<S, Ix1>
123148
where
124149
S: DataOwned<Elem = A>,
125150
{
151+
/// Create a one-dimensional array from an iterable.
152+
///
153+
/// **Panics** if the length is greater than `isize::MAX`.
154+
///
155+
/// ```rust
156+
/// use ndarray::{Array, arr1};
157+
/// use std::iter::FromIterator;
158+
///
159+
/// // Either use `from_iter` directly or use `Iterator::collect`.
160+
/// let array = Array::from_iter((0..5).map(|x| x * x));
161+
/// assert!(array == arr1(&[0, 1, 4, 9, 16]))
162+
/// ```
126163
fn from_iter<I>(iterable: I) -> ArrayBase<S, Ix1>
127164
where
128165
I: IntoIterator<Item = A>,
129166
{
130-
ArrayBase::from_iter(iterable)
167+
Self::from(iterable.into_iter().collect::<Vec<A>>())
131168
}
132169
}
133170

src/free_functions.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ macro_rules! array {
4848
$crate::Array2::from(vec![$([$($x,)*],)*])
4949
}};
5050
($($x:expr),* $(,)*) => {{
51-
$crate::Array::from_vec(vec![$($x,)*])
51+
$crate::Array::from(vec![$($x,)*])
5252
}};
5353
}
5454

@@ -59,7 +59,7 @@ pub fn arr0<A>(x: A) -> Array0<A> {
5959

6060
/// Create a one-dimensional array with elements from `xs`.
6161
pub fn arr1<A: Clone>(xs: &[A]) -> Array1<A> {
62-
ArrayBase::from_vec(xs.to_vec())
62+
ArrayBase::from(xs.to_vec())
6363
}
6464

6565
/// Create a one-dimensional array with elements from `xs`.
@@ -226,12 +226,6 @@ where
226226
Array2::from(xs.to_vec())
227227
}
228228

229-
impl<A> From<Vec<A>> for Array1<A> {
230-
fn from(xs: Vec<A>) -> Self {
231-
Array1::from_vec(xs)
232-
}
233-
}
234-
235229
impl<A, V> From<Vec<V>> for Array2<A>
236230
where
237231
V: FixedInitializer<Elem = A>,

src/impl_constructors.rs

+7-33
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
#![allow(clippy::match_wild_err_arm)]
1414

1515
use num_traits::{Float, One, Zero};
16-
use std::isize;
17-
use std::mem;
1816

1917
use crate::dimension;
2018
use crate::error::{self, ShapeError};
@@ -42,35 +40,11 @@ where
4240
/// ```rust
4341
/// use ndarray::Array;
4442
///
45-
/// let array = Array::from_vec(vec![1., 2., 3., 4.]);
43+
/// let array = Array::from(vec![1., 2., 3., 4.]);
4644
/// ```
45+
#[deprecated(note = "use standard `from`", since = "0.13.0")]
4746
pub fn from_vec(v: Vec<A>) -> Self {
48-
if mem::size_of::<A>() == 0 {
49-
assert!(
50-
v.len() <= isize::MAX as usize,
51-
"Length must fit in `isize`.",
52-
);
53-
}
54-
unsafe { Self::from_shape_vec_unchecked(v.len() as Ix, v) }
55-
}
56-
57-
/// Create a one-dimensional array from an iterable.
58-
///
59-
/// **Panics** if the length is greater than `isize::MAX`.
60-
///
61-
/// ```rust
62-
/// use ndarray::{Array, arr1};
63-
///
64-
/// let array = Array::from_iter((0..5).map(|x| x * x));
65-
/// assert!(array == arr1(&[0, 1, 4, 9, 16]))
66-
/// ```
67-
// Potentially remove; see https://github.com/rust-ndarray/ndarray/pull/642#discussion_r296068930
68-
#[allow(clippy::should_implement_trait)]
69-
pub fn from_iter<I>(iterable: I) -> Self
70-
where
71-
I: IntoIterator<Item = A>,
72-
{
73-
Self::from_vec(iterable.into_iter().collect())
47+
Self::from(v)
7448
}
7549

7650
/// Create a one-dimensional array with `n` evenly spaced elements from
@@ -94,7 +68,7 @@ where
9468
where
9569
A: Float,
9670
{
97-
Self::from_vec(to_vec(linspace::linspace(start, end, n)))
71+
Self::from(to_vec(linspace::linspace(start, end, n)))
9872
}
9973

10074
/// Create a one-dimensional array with elements from `start` to `end`
@@ -112,7 +86,7 @@ where
11286
where
11387
A: Float,
11488
{
115-
Self::from_vec(to_vec(linspace::range(start, end, step)))
89+
Self::from(to_vec(linspace::range(start, end, step)))
11690
}
11791

11892
/// Create a one-dimensional array with `n` logarithmically spaced
@@ -140,7 +114,7 @@ where
140114
where
141115
A: Float,
142116
{
143-
Self::from_vec(to_vec(logspace::logspace(base, start, end, n)))
117+
Self::from(to_vec(logspace::logspace(base, start, end, n)))
144118
}
145119

146120
/// Create a one-dimensional array with `n` geometrically spaced elements
@@ -174,7 +148,7 @@ where
174148
where
175149
A: Float,
176150
{
177-
Some(Self::from_vec(to_vec(geomspace::geomspace(start, end, n)?)))
151+
Some(Self::from(to_vec(geomspace::geomspace(start, end, n)?)))
178152
}
179153
}
180154

src/impl_methods.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,7 @@ where
10101010
/// ```
10111011
/// use ndarray::Array;
10121012
/// use ndarray::{arr3, Axis};
1013+
/// use std::iter::FromIterator;
10131014
///
10141015
/// let a = Array::from_iter(0..28).into_shape((2, 7, 2)).unwrap();
10151016
/// let mut iter = a.axis_chunks_iter(Axis(1), 2);

src/slice.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ pub unsafe fn deref_raw_view_mut_into_view_mut_with_life<'a, A, D: Dimension>(
701701
/// use ndarray::prelude::*;
702702
///
703703
/// # fn main() {
704-
/// let mut arr = Array1::from_iter(0..12);
704+
/// let mut arr: Array1<_> = (0..12).collect();
705705
/// let (a, b, c, d) = multislice!(arr, [0..5], mut [6..;2], [1..6], mut [7..;2]);
706706
/// assert_eq!(a, array![0, 1, 2, 3, 4]);
707707
/// assert_eq!(b, array![6, 8, 10]);
@@ -719,7 +719,7 @@ pub unsafe fn deref_raw_view_mut_into_view_mut_with_life<'a, A, D: Dimension>(
719719
/// # use ndarray::multislice;
720720
/// # use ndarray::prelude::*;
721721
/// # fn main() {
722-
/// let mut arr = Array1::from_iter(0..12);
722+
/// let mut arr: Array1<_> = (0..12).collect();
723723
/// multislice!(arr, [0..5], mut [1..;2]); // panic!
724724
/// # }
725725
/// ```
@@ -731,7 +731,7 @@ pub unsafe fn deref_raw_view_mut_into_view_mut_with_life<'a, A, D: Dimension>(
731731
/// # use ndarray::multislice;
732732
/// # use ndarray::prelude::*;
733733
/// # fn main() {
734-
/// let mut arr = Array1::from_iter(0..12);
734+
/// let mut arr: Array1<_> = (0..12).collect();
735735
/// multislice!(arr, mut [0..5], mut [1..;2]); // panic!
736736
/// # }
737737
/// ```

tests/array.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use ndarray::indices;
1717
use ndarray::prelude::*;
1818
use ndarray::{arr3, multislice, rcarr2};
1919
use ndarray::{Slice, SliceInfo, SliceOrIndex};
20+
use std::iter::FromIterator;
2021

2122
macro_rules! assert_panics {
2223
($body:expr) => {
@@ -670,7 +671,7 @@ fn test_sub() {
670671
assert_eq!(s2.shape(), &[4, 2]);
671672
let n = ArcArray::linspace(8., 15., 8).reshape((4, 2));
672673
assert_eq!(n, s2);
673-
let m = ArcArray::from_vec(vec![2., 3., 10., 11.]).reshape((2, 2));
674+
let m = ArcArray::from(vec![2., 3., 10., 11.]).reshape((2, 2));
674675
assert_eq!(m, mat.index_axis(Axis(1), 1));
675676
}
676677

@@ -1036,7 +1037,7 @@ fn array0_into_scalar() {
10361037

10371038
#[test]
10381039
fn owned_array1() {
1039-
let mut a = Array::from_vec(vec![1, 2, 3, 4]);
1040+
let mut a = Array::from(vec![1, 2, 3, 4]);
10401041
for elt in a.iter_mut() {
10411042
*elt = 2;
10421043
}
@@ -1239,7 +1240,7 @@ fn from_vec_dim_stride_2d_rejects() {
12391240

12401241
#[test]
12411242
fn views() {
1242-
let a = ArcArray::from_vec(vec![1, 2, 3, 4]).reshape((2, 2));
1243+
let a = ArcArray::from(vec![1, 2, 3, 4]).reshape((2, 2));
12431244
let b = a.view();
12441245
assert_eq!(a, b);
12451246
assert_eq!(a.shape(), b.shape());
@@ -1256,7 +1257,7 @@ fn views() {
12561257

12571258
#[test]
12581259
fn view_mut() {
1259-
let mut a = ArcArray::from_vec(vec![1, 2, 3, 4]).reshape((2, 2));
1260+
let mut a = ArcArray::from(vec![1, 2, 3, 4]).reshape((2, 2));
12601261
for elt in &mut a.view_mut() {
12611262
*elt = 0;
12621263
}
@@ -1275,7 +1276,7 @@ fn view_mut() {
12751276

12761277
#[test]
12771278
fn slice_mut() {
1278-
let mut a = ArcArray::from_vec(vec![1, 2, 3, 4]).reshape((2, 2));
1279+
let mut a = ArcArray::from(vec![1, 2, 3, 4]).reshape((2, 2));
12791280
for elt in a.slice_mut(s![.., ..]) {
12801281
*elt = 0;
12811282
}

tests/azip.rs

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ extern crate ndarray;
1010

1111
use ndarray::prelude::*;
1212
use ndarray::Zip;
13+
use std::iter::FromIterator;
1314

1415
use itertools::{assert_equal, cloned};
1516

tests/broadcast.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fn test_broadcast() {
5252
let (_, n, k) = (16, 16, 16);
5353
let x1 = 1.;
5454
// b0 broadcast 1 -> n, k
55-
let x = Array::from_vec(vec![x1]);
55+
let x = Array::from(vec![x1]);
5656
let b0 = x.broadcast((n, k)).unwrap();
5757
// b1 broadcast n -> n, k
5858
let b1 = Array::from_elem(n, x1);
@@ -72,7 +72,7 @@ fn test_broadcast_1d() {
7272
let n = 16;
7373
let x1 = 1.;
7474
// b0 broadcast 1 -> n
75-
let x = Array::from_vec(vec![x1]);
75+
let x = Array::from(vec![x1]);
7676
let b0 = x.broadcast(n).unwrap();
7777
let b2 = Array::from_elem(n, x1);
7878

tests/iterators.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use ndarray::{arr2, arr3, aview1, indices, s, Axis, Data, Dimension, Slice};
1313

1414
use itertools::assert_equal;
1515
use itertools::{enumerate, rev};
16+
use std::iter::FromIterator;
1617

1718
#[test]
1819
fn double_ended() {
@@ -401,9 +402,7 @@ fn axis_chunks_iter_corner_cases() {
401402
fn axis_chunks_iter_zero_stride() {
402403
{
403404
// stride 0 case
404-
let b = Array::from_vec(vec![0f32; 0])
405-
.into_shape((5, 0, 3))
406-
.unwrap();
405+
let b = Array::from(vec![0f32; 0]).into_shape((5, 0, 3)).unwrap();
407406
let shapes: Vec<_> = b
408407
.axis_chunks_iter(Axis(0), 2)
409408
.map(|v| v.raw_dim())
@@ -413,9 +412,7 @@ fn axis_chunks_iter_zero_stride() {
413412

414413
{
415414
// stride 0 case reverse
416-
let b = Array::from_vec(vec![0f32; 0])
417-
.into_shape((5, 0, 3))
418-
.unwrap();
415+
let b = Array::from(vec![0f32; 0]).into_shape((5, 0, 3)).unwrap();
419416
let shapes: Vec<_> = b
420417
.axis_chunks_iter(Axis(0), 2)
421418
.rev()
@@ -426,7 +423,7 @@ fn axis_chunks_iter_zero_stride() {
426423

427424
// From issue #542, ZST element
428425
{
429-
let a = Array::from_vec(vec![(); 3]);
426+
let a = Array::from(vec![(); 3]);
430427
let chunks: Vec<_> = a.axis_chunks_iter(Axis(0), 2).collect();
431428
assert_eq!(chunks, vec![a.slice(s![0..2]), a.slice(s![2..])]);
432429
}
@@ -609,7 +606,7 @@ fn test_rfold() {
609606
acc
610607
});
611608
assert_eq!(
612-
Array1::from_vec(output),
609+
Array1::from(output),
613610
Array::from_iter((1..10).rev().map(|i| i * 2))
614611
);
615612
}

tests/ix0.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ fn test_ix0_add_add() {
5252

5353
#[test]
5454
fn test_ix0_add_broad() {
55-
let mut b = Array::from_vec(vec![5., 6.]);
55+
let mut b = Array::from(vec![5., 6.]);
5656
let mut a = Array::zeros(Ix0());
5757
a += 1.;
5858
b += &a;

tests/ixdyn.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ fn test_0_add_add() {
147147

148148
#[test]
149149
fn test_0_add_broad() {
150-
let mut b = Array::from_vec(vec![5., 6.]);
150+
let mut b = Array::from(vec![5., 6.]);
151151
let mut a = Array::zeros(vec![]);
152152
a += 1.;
153153
b += &a;

0 commit comments

Comments
 (0)