maxframe 0.1.0b5__cp310-cp310-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
from ..datasource import tensor as astensor
|
|
18
|
+
from ..utils import check_out_param, validate_axis
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def take(a, indices, axis=None, out=None):
|
|
22
|
+
"""
|
|
23
|
+
Take elements from a tensor along an axis.
|
|
24
|
+
|
|
25
|
+
When axis is not None, this function does the same thing as "fancy"
|
|
26
|
+
indexing (indexing arrays using tensors); however, it can be easier to use
|
|
27
|
+
if you need elements along a given axis. A call such as
|
|
28
|
+
``mt.take(arr, indices, axis=3)`` is equivalent to
|
|
29
|
+
``arr[:,:,:,indices,...]``.
|
|
30
|
+
|
|
31
|
+
Explained without fancy indexing, this is equivalent to the following use
|
|
32
|
+
of `ndindex`, which sets each of ``ii``, ``jj``, and ``kk`` to a tuple of
|
|
33
|
+
indices::
|
|
34
|
+
|
|
35
|
+
Ni, Nk = a.shape[:axis], a.shape[axis+1:]
|
|
36
|
+
Nj = indices.shape
|
|
37
|
+
for ii in ndindex(Ni):
|
|
38
|
+
for jj in ndindex(Nj):
|
|
39
|
+
for kk in ndindex(Nk):
|
|
40
|
+
out[ii + jj + kk] = a[ii + (indices[jj],) + kk]
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
a : array_like (Ni..., M, Nk...)
|
|
45
|
+
The source tensor.
|
|
46
|
+
indices : array_like (Nj...)
|
|
47
|
+
The indices of the values to extract.
|
|
48
|
+
|
|
49
|
+
Also allow scalars for indices.
|
|
50
|
+
axis : int, optional
|
|
51
|
+
The axis over which to select values. By default, the flattened
|
|
52
|
+
input tensor is used.
|
|
53
|
+
out : Tensor, optional (Ni..., Nj..., Nk...)
|
|
54
|
+
If provided, the result will be placed in this tensor. It should
|
|
55
|
+
be of the appropriate shape and dtype.
|
|
56
|
+
mode : {'raise', 'wrap', 'clip'}, optional
|
|
57
|
+
Specifies how out-of-bounds indices will behave.
|
|
58
|
+
|
|
59
|
+
* 'raise' -- raise an error (default)
|
|
60
|
+
* 'wrap' -- wrap around
|
|
61
|
+
* 'clip' -- clip to the range
|
|
62
|
+
|
|
63
|
+
'clip' mode means that all indices that are too large are replaced
|
|
64
|
+
by the index that addresses the last element along that axis. Note
|
|
65
|
+
that this disables indexing with negative numbers.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
out : Tensor (Ni..., Nj..., Nk...)
|
|
70
|
+
The returned tensor has the same type as `a`.
|
|
71
|
+
|
|
72
|
+
See Also
|
|
73
|
+
--------
|
|
74
|
+
compress : Take elements using a boolean mask
|
|
75
|
+
Tensor.take : equivalent method
|
|
76
|
+
|
|
77
|
+
Notes
|
|
78
|
+
-----
|
|
79
|
+
|
|
80
|
+
By eliminating the inner loop in the description above, and using `s_` to
|
|
81
|
+
build simple slice objects, `take` can be expressed in terms of applying
|
|
82
|
+
fancy indexing to each 1-d slice::
|
|
83
|
+
|
|
84
|
+
Ni, Nk = a.shape[:axis], a.shape[axis+1:]
|
|
85
|
+
for ii in ndindex(Ni):
|
|
86
|
+
for kk in ndindex(Nj):
|
|
87
|
+
out[ii + s_[...,] + kk] = a[ii + s_[:,] + kk][indices]
|
|
88
|
+
|
|
89
|
+
For this reason, it is equivalent to (but faster than) the following use
|
|
90
|
+
of `apply_along_axis`::
|
|
91
|
+
|
|
92
|
+
out = mt.apply_along_axis(lambda a_1d: a_1d[indices], axis, a)
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> import maxframe.tensor as mt
|
|
97
|
+
>>> a = [4, 3, 5, 7, 6, 8]
|
|
98
|
+
>>> indices = [0, 1, 4]
|
|
99
|
+
>>> mt.take(a, indices).execute()
|
|
100
|
+
array([4, 3, 6])
|
|
101
|
+
|
|
102
|
+
In this example if `a` is a tensor, "fancy" indexing can be used.
|
|
103
|
+
|
|
104
|
+
>>> a = mt.array(a)
|
|
105
|
+
>>> a[indices].execute()
|
|
106
|
+
array([4, 3, 6])
|
|
107
|
+
|
|
108
|
+
If `indices` is not one dimensional, the output also has these dimensions.
|
|
109
|
+
|
|
110
|
+
>>> mt.take(a, [[0, 1], [2, 3]]).execute()
|
|
111
|
+
array([[4, 3],
|
|
112
|
+
[5, 7]])
|
|
113
|
+
"""
|
|
114
|
+
a = astensor(a)
|
|
115
|
+
if axis is None:
|
|
116
|
+
t = a.ravel()[indices]
|
|
117
|
+
else:
|
|
118
|
+
axis = validate_axis(a.ndim, axis)
|
|
119
|
+
t = a[(slice(None),) * axis + (indices,)]
|
|
120
|
+
|
|
121
|
+
if out is None:
|
|
122
|
+
return t
|
|
123
|
+
|
|
124
|
+
if out.shape != t.shape:
|
|
125
|
+
raise ValueError(
|
|
126
|
+
f"output tensor has wrong shape, expect: {t.shape}, got: {out.shape}"
|
|
127
|
+
)
|
|
128
|
+
check_out_param(out, t, "unsafe")
|
|
129
|
+
out.data = t.data
|
|
130
|
+
return out
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from ...datasource import array, empty, ones, tensor
|
|
21
|
+
from ...datasource.ones import TensorOnes
|
|
22
|
+
from .. import choose, compress, fill_diagonal, unravel_index
|
|
23
|
+
from ..setitem import TensorIndexSetValue
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_bool_indexing():
|
|
27
|
+
t = ones((100, 200, 300))
|
|
28
|
+
indexed = t[t < 2]
|
|
29
|
+
assert len(indexed.shape) == 1
|
|
30
|
+
assert np.isnan(indexed.shape[0])
|
|
31
|
+
|
|
32
|
+
t2 = ones((100, 200))
|
|
33
|
+
indexed = t[t2 < 2]
|
|
34
|
+
assert len(indexed.shape) == 2
|
|
35
|
+
assert np.isnan(indexed.shape[0])
|
|
36
|
+
assert indexed.shape[1] == 300
|
|
37
|
+
|
|
38
|
+
t2 = ones((100, 200))
|
|
39
|
+
indexed = t[t2 < 2] + 1
|
|
40
|
+
assert len(indexed.shape) == 2
|
|
41
|
+
assert np.isnan(indexed.shape[0])
|
|
42
|
+
assert indexed.shape[1] == 300
|
|
43
|
+
|
|
44
|
+
t2 = ones((10, 20))
|
|
45
|
+
rs = np.random.RandomState(0)
|
|
46
|
+
i1 = np.zeros(10, dtype=bool)
|
|
47
|
+
i1[rs.permutation(np.arange(10))[:5]] = True
|
|
48
|
+
i2 = np.zeros(20, dtype=bool)
|
|
49
|
+
i2[rs.permutation(np.arange(20))[:5]] = True
|
|
50
|
+
indexed = t2[i1, i2]
|
|
51
|
+
assert len(indexed.shape) == 1
|
|
52
|
+
assert indexed.shape[0] == 5
|
|
53
|
+
|
|
54
|
+
t3 = ones((101, 200))
|
|
55
|
+
with pytest.raises(IndexError) as cm:
|
|
56
|
+
_ = t[t3 < 2] # noqa: F841
|
|
57
|
+
e = cm.value.args[0]
|
|
58
|
+
assert "along dimension 0" in e
|
|
59
|
+
assert "dimension is 100 but corresponding boolean dimension is 101" in e
|
|
60
|
+
|
|
61
|
+
t4 = ones((100, 201))
|
|
62
|
+
with pytest.raises(IndexError) as cm:
|
|
63
|
+
_ = t[t4 < 2] # noqa: F841
|
|
64
|
+
e = cm.value.args[0]
|
|
65
|
+
assert "along dimension 1" in e
|
|
66
|
+
assert "dimension is 200 but corresponding boolean dimension is 201" in e
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_slice():
|
|
70
|
+
t = ones((100, 200, 300))
|
|
71
|
+
t2 = t[10:30, 199:, -30:303]
|
|
72
|
+
assert t2.shape == (20, 1, 30)
|
|
73
|
+
|
|
74
|
+
t3 = t[10:90:4, 20:80:5]
|
|
75
|
+
s1 = len(list(range(100))[10:90:4])
|
|
76
|
+
s2 = len(list(range(200))[20:80:5])
|
|
77
|
+
assert t3.shape == (s1, s2, 300)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_fancy_indexing():
|
|
81
|
+
t = ones((100, 200, 300))
|
|
82
|
+
t2 = t[[0, 1], [2, 3]]
|
|
83
|
+
assert t2.shape == (2, 300)
|
|
84
|
+
|
|
85
|
+
t3 = t[[[0, 1], [2, 3]], [4, 5]]
|
|
86
|
+
assert t3.shape == (2, 2, 300)
|
|
87
|
+
|
|
88
|
+
with pytest.raises(IndexError) as cm:
|
|
89
|
+
_ = t[[1, 2], [3, 4, 5]] # noqa: F841
|
|
90
|
+
e = cm.value.args[0]
|
|
91
|
+
assert (
|
|
92
|
+
e == "shape mismatch: indexing arrays could not be broadcast "
|
|
93
|
+
"together with shapes (2,) (3,)"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
with pytest.raises(IndexError):
|
|
97
|
+
t[[100]]
|
|
98
|
+
|
|
99
|
+
t = ones((100, 200, 300), chunk_size=10)
|
|
100
|
+
|
|
101
|
+
# fancy index on numpy ndarrays
|
|
102
|
+
|
|
103
|
+
t4 = t[:10, -10:, [13, 244, 151, 242, 34]]
|
|
104
|
+
assert t4.shape == (10, 10, 5)
|
|
105
|
+
|
|
106
|
+
t5 = t[:10, -10:, [1, 10, 20, 33, 34, 200]]
|
|
107
|
+
assert t5.shape == (10, 10, 6)
|
|
108
|
+
|
|
109
|
+
t6 = t[[20, 1, 33, 22, 11], :15, [255, 211, 2, 11, 121]]
|
|
110
|
+
assert t6.shape == (5, 15)
|
|
111
|
+
|
|
112
|
+
t7 = t[[5, 6, 33, 66], :15, [0, 9, 2, 11]]
|
|
113
|
+
assert t7.shape == (4, 15)
|
|
114
|
+
|
|
115
|
+
t8 = t[[[5, 33], [66, 6]], :15, [255, 11]]
|
|
116
|
+
assert t8.shape == (2, 2, 15)
|
|
117
|
+
|
|
118
|
+
# fancy index on tensors
|
|
119
|
+
|
|
120
|
+
t9 = t[:10, -10:, tensor([13, 244, 151, 242, 34], chunk_size=2)]
|
|
121
|
+
assert t9.shape == (10, 10, 5)
|
|
122
|
+
|
|
123
|
+
t10 = t[:10, -10:, tensor([1, 10, 20, 33, 34, 200], chunk_size=4)]
|
|
124
|
+
assert t10.shape == (10, 10, 6)
|
|
125
|
+
|
|
126
|
+
t11 = t[
|
|
127
|
+
tensor([20, 1, 33, 22, 11], chunk_size=2),
|
|
128
|
+
:15,
|
|
129
|
+
tensor([255, 211, 2, 11, 121], chunk_size=3),
|
|
130
|
+
]
|
|
131
|
+
assert t11.shape == (5, 15)
|
|
132
|
+
# need a concat, because the fancy indexes are not ascending according to chunk index
|
|
133
|
+
|
|
134
|
+
t12 = t[tensor([5, 6, 33, 66], chunk_size=2), :15, [0, 9, 2, 11]]
|
|
135
|
+
assert t12.shape == (4, 15)
|
|
136
|
+
|
|
137
|
+
t13 = t[tensor([[5, 33], [66, 6]]), :15, tensor([255, 11])]
|
|
138
|
+
assert t13.shape == (2, 2, 15)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_mixed_indexing():
|
|
142
|
+
t = ones((100, 200, 300, 400))
|
|
143
|
+
|
|
144
|
+
with pytest.raises(IndexError):
|
|
145
|
+
_ = t[ones((100, 200), dtype=float)] # noqa: F841
|
|
146
|
+
|
|
147
|
+
t2 = t[ones(100) < 2, ..., 20::101, 2]
|
|
148
|
+
assert len(t2.shape) == 3
|
|
149
|
+
assert np.isnan(t2.shape[0])
|
|
150
|
+
|
|
151
|
+
t3 = ones((2, 3, 4, 5))
|
|
152
|
+
t4 = t3[1]
|
|
153
|
+
assert t4.flags["C_CONTIGUOUS"] == np.ones((2, 3, 4, 5))[1].flags["C_CONTIGUOUS"]
|
|
154
|
+
assert t4.flags["F_CONTIGUOUS"] == np.ones((2, 3, 4, 5))[1].flags["F_CONTIGUOUS"]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def test_setitem():
|
|
158
|
+
shape = (10, 20, 30, 40)
|
|
159
|
+
t = ones(shape, chunk_size=5, dtype="i4")
|
|
160
|
+
t[5:20:3, 5, ..., :-5] = 2.2
|
|
161
|
+
|
|
162
|
+
assert isinstance(t.op, TensorIndexSetValue)
|
|
163
|
+
assert t.shape == shape
|
|
164
|
+
assert isinstance(t.inputs[0].op.outputs[0].op, TensorOnes)
|
|
165
|
+
|
|
166
|
+
t2 = ones(shape, chunk_size=5, dtype="i4")
|
|
167
|
+
shape = t2[5:20:3, 5, ..., :-5].shape
|
|
168
|
+
t2[5:20:3, 5, ..., :-5] = ones(shape, chunk_size=4, dtype="i4") * 2
|
|
169
|
+
|
|
170
|
+
assert isinstance(t2.op, TensorIndexSetValue)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_choose():
|
|
174
|
+
choices = [[0, 1, 2, 3], [10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]]
|
|
175
|
+
|
|
176
|
+
with pytest.raises(TypeError):
|
|
177
|
+
choose([2, 3, 1, 0], choices, out=1)
|
|
178
|
+
|
|
179
|
+
with pytest.raises(ValueError):
|
|
180
|
+
choose([2, 3, 1, 0], choices, out=tensor(np.empty((1, 4))))
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def test_unravel_index():
|
|
184
|
+
indices = tensor([22, 41, 37], chunk_size=1)
|
|
185
|
+
t = unravel_index(indices, (7, 6))
|
|
186
|
+
|
|
187
|
+
assert len(t) == 2
|
|
188
|
+
|
|
189
|
+
with pytest.raises(TypeError):
|
|
190
|
+
unravel_index([22, 41, 37], (7, 6), order="B")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_compress():
|
|
194
|
+
a = np.array([[1, 2], [3, 4], [5, 6]])
|
|
195
|
+
|
|
196
|
+
with pytest.raises(TypeError):
|
|
197
|
+
compress([0, 1], a, axis=0, out=1)
|
|
198
|
+
|
|
199
|
+
with pytest.raises(TypeError):
|
|
200
|
+
compress(
|
|
201
|
+
[0, 1],
|
|
202
|
+
array([[1, 2], [3, 4], [5, 6]], dtype="i8"),
|
|
203
|
+
axis=0,
|
|
204
|
+
out=empty((1, 2), dtype="f8"),
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def test_operator_key():
|
|
209
|
+
t = ones((10, 2), chunk_size=5)
|
|
210
|
+
t_slice1 = t[:5]
|
|
211
|
+
t_slice2 = t[5:]
|
|
212
|
+
|
|
213
|
+
assert t_slice1.op.key != t_slice2.op.key
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def test_fill_diagonal():
|
|
217
|
+
a = tensor(np.random.rand(10, 13))
|
|
218
|
+
fill_diagonal(a, 10)
|
|
219
|
+
|
|
220
|
+
assert a.shape == (10, 13)
|
|
221
|
+
|
|
222
|
+
# must be Tensor
|
|
223
|
+
with pytest.raises(TypeError):
|
|
224
|
+
fill_diagonal(np.random.rand(11, 10), 1)
|
|
225
|
+
|
|
226
|
+
# at least 2-d required
|
|
227
|
+
with pytest.raises(ValueError):
|
|
228
|
+
a = tensor(np.random.rand(4))
|
|
229
|
+
fill_diagonal(a, 1)
|
|
230
|
+
|
|
231
|
+
# for more than 2-d, shape on each dimension should be equal
|
|
232
|
+
with pytest.raises(ValueError):
|
|
233
|
+
a = tensor(np.random.rand(11, 10, 11))
|
|
234
|
+
fill_diagonal(a, 1)
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
from collections.abc import Iterable
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
|
|
21
|
+
from ... import opcodes
|
|
22
|
+
from ...core import ExecutableTuple
|
|
23
|
+
from ...serialization.serializables import FieldTypes, KeyField, StringField, TupleField
|
|
24
|
+
from ..core import TensorOrder
|
|
25
|
+
from ..datasource import tensor as astensor
|
|
26
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class TensorUnravelIndex(TensorHasInput, TensorOperatorMixin):
|
|
30
|
+
_op_type_ = opcodes.UNRAVEL_INDEX
|
|
31
|
+
|
|
32
|
+
_input = KeyField("input")
|
|
33
|
+
dims = TupleField("dims", FieldTypes.int32, default=None)
|
|
34
|
+
order = StringField("order", default=None)
|
|
35
|
+
|
|
36
|
+
def __init__(self, order=None, **kw):
|
|
37
|
+
super().__init__(order=order, **kw)
|
|
38
|
+
if self.order is None:
|
|
39
|
+
self.order = "C"
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def output_limit(self):
|
|
43
|
+
return float("inf")
|
|
44
|
+
|
|
45
|
+
def _set_inputs(self, inputs):
|
|
46
|
+
super()._set_inputs(inputs)
|
|
47
|
+
self._input = self._inputs[0]
|
|
48
|
+
|
|
49
|
+
def __call__(self, indices):
|
|
50
|
+
order = TensorOrder.C_ORDER if self.order == "C" else TensorOrder.F_ORDER
|
|
51
|
+
kws = [{"pos": i, "order": order} for i in range(len(self.dims))]
|
|
52
|
+
return ExecutableTuple(
|
|
53
|
+
self.new_tensors([indices], indices.shape, kws=kws, output_limit=len(kws))
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def unravel_index(indices, dims, order="C"):
|
|
58
|
+
"""
|
|
59
|
+
Converts a flat index or tensor of flat indices into a tuple
|
|
60
|
+
of coordinate tensors.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
indices : array_like
|
|
65
|
+
An integer tensor whose elements are indices into the flattened
|
|
66
|
+
version of a tensor of dimensions ``dims``.
|
|
67
|
+
dims : tuple of ints
|
|
68
|
+
The shape of the tensor to use for unraveling ``indices``.
|
|
69
|
+
order : {'C', 'F'}, optional
|
|
70
|
+
Determines whether the indices should be viewed as indexing in
|
|
71
|
+
row-major (C-style) or column-major (Fortran-style) order.
|
|
72
|
+
|
|
73
|
+
Returns
|
|
74
|
+
-------
|
|
75
|
+
unraveled_coords : tuple of Tensor
|
|
76
|
+
Each tensor in the tuple has the same shape as the ``indices``
|
|
77
|
+
tensor.
|
|
78
|
+
|
|
79
|
+
See Also
|
|
80
|
+
--------
|
|
81
|
+
ravel_multi_index
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> import maxframe.tensor as mt
|
|
86
|
+
|
|
87
|
+
>>> mt.unravel_index([22, 41, 37], (7,6)).execute()
|
|
88
|
+
(array([3, 6, 6]), array([4, 5, 1]))
|
|
89
|
+
|
|
90
|
+
>>> mt.unravel_index(1621, (6,7,8,9)).execute()
|
|
91
|
+
(3, 1, 4, 1)
|
|
92
|
+
"""
|
|
93
|
+
indices = astensor(indices)
|
|
94
|
+
if isinstance(dims, Iterable):
|
|
95
|
+
dims = tuple(dims)
|
|
96
|
+
else:
|
|
97
|
+
dims = (dims,)
|
|
98
|
+
|
|
99
|
+
if order not in "CF":
|
|
100
|
+
raise TypeError("only 'C' or 'F' order is permitted")
|
|
101
|
+
|
|
102
|
+
op = TensorUnravelIndex(dims=dims, dtype=np.dtype(np.intp), order=order)
|
|
103
|
+
return op(indices)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .stack import stack
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ...serialization.serializables import Int32Field
|
|
21
|
+
from ..core import Tensor, TensorOrder
|
|
22
|
+
from ..datasource import tensor as astensor
|
|
23
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
24
|
+
from ..utils import check_out_param
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TensorStack(TensorOperator, TensorOperatorMixin):
|
|
28
|
+
_op_type_ = opcodes.STACK
|
|
29
|
+
|
|
30
|
+
axis = Int32Field("axis", default=None)
|
|
31
|
+
|
|
32
|
+
def __call__(self, tensors, out=None):
|
|
33
|
+
if out is not None and not isinstance(out, Tensor):
|
|
34
|
+
raise TypeError(f"`out` must be a Tensor, got {type(out)} instead")
|
|
35
|
+
|
|
36
|
+
shape = (
|
|
37
|
+
tensors[0].shape[: self.axis]
|
|
38
|
+
+ (len(tensors),)
|
|
39
|
+
+ tensors[0].shape[self.axis :]
|
|
40
|
+
)
|
|
41
|
+
tensor_order = TensorOrder.C_ORDER if out is None else out.order
|
|
42
|
+
t = self.new_tensor(tensors, shape, order=tensor_order)
|
|
43
|
+
|
|
44
|
+
if out is None:
|
|
45
|
+
return t
|
|
46
|
+
|
|
47
|
+
if out.shape != t.shape:
|
|
48
|
+
raise ValueError("Output tensor has wrong dimensionality")
|
|
49
|
+
check_out_param(out, t, "same_kind")
|
|
50
|
+
out.data = t.data
|
|
51
|
+
return out
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def stack(tensors, axis=0, out=None):
|
|
55
|
+
"""
|
|
56
|
+
Join a sequence of tensors along a new axis.
|
|
57
|
+
|
|
58
|
+
The `axis` parameter specifies the index of the new axis in the dimensions
|
|
59
|
+
of the result. For example, if ``axis=0`` it will be the first dimension
|
|
60
|
+
and if ``axis=-1`` it will be the last dimension.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
tensors : sequence of array_like
|
|
65
|
+
Each tensor must have the same shape.
|
|
66
|
+
axis : int, optional
|
|
67
|
+
The axis in the result tensor along which the input tensors are stacked.
|
|
68
|
+
out : Tensor, optional
|
|
69
|
+
If provided, the destination to place the result. The shape must be
|
|
70
|
+
correct, matching that of what stack would have returned if no
|
|
71
|
+
out argument were specified.
|
|
72
|
+
|
|
73
|
+
Returns
|
|
74
|
+
-------
|
|
75
|
+
stacked : Tensor
|
|
76
|
+
The stacked tensor has one more dimension than the input tensors.
|
|
77
|
+
|
|
78
|
+
See Also
|
|
79
|
+
--------
|
|
80
|
+
concatenate : Join a sequence of tensors along an existing axis.
|
|
81
|
+
split : Split tensor into a list of multiple sub-tensors of equal size.
|
|
82
|
+
block : Assemble tensors from blocks.
|
|
83
|
+
|
|
84
|
+
Examples
|
|
85
|
+
--------
|
|
86
|
+
>>> import maxframe.tensor as mt
|
|
87
|
+
|
|
88
|
+
>>> arrays = [mt.random.randn(3, 4) for _ in range(10)]
|
|
89
|
+
>>> mt.stack(arrays, axis=0).shape
|
|
90
|
+
(10, 3, 4)
|
|
91
|
+
|
|
92
|
+
>>> mt.stack(arrays, axis=1).shape
|
|
93
|
+
(3, 10, 4)
|
|
94
|
+
|
|
95
|
+
>>> mt.stack(arrays, axis=2).shape
|
|
96
|
+
(3, 4, 10)
|
|
97
|
+
|
|
98
|
+
>>> a = mt.array([1, 2, 3])
|
|
99
|
+
>>> b = mt.array([2, 3, 4])
|
|
100
|
+
>>> mt.stack((a, b)).execute()
|
|
101
|
+
array([[1, 2, 3],
|
|
102
|
+
[2, 3, 4]])
|
|
103
|
+
|
|
104
|
+
>>> mt.stack((a, b), axis=-1).execute()
|
|
105
|
+
array([[1, 2],
|
|
106
|
+
[2, 3],
|
|
107
|
+
[3, 4]])
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
tensors = [astensor(t) for t in tensors]
|
|
111
|
+
|
|
112
|
+
to_check_shapes = []
|
|
113
|
+
for t in tensors:
|
|
114
|
+
if not any(np.isnan(s) for s in t.shape):
|
|
115
|
+
to_check_shapes.append(t.shape)
|
|
116
|
+
if to_check_shapes and len(set(to_check_shapes)) != 1:
|
|
117
|
+
raise ValueError("all input tensors must have the same shape")
|
|
118
|
+
|
|
119
|
+
ndim = len(tensors[0].shape)
|
|
120
|
+
raw_axis = axis
|
|
121
|
+
if axis < 0:
|
|
122
|
+
axis = ndim + axis + 1
|
|
123
|
+
if axis > ndim or axis < 0:
|
|
124
|
+
raise np.AxisError(
|
|
125
|
+
f"axis {raw_axis} is out of bounds for tensor of dimension {ndim}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
dtype = np.result_type(*[t.dtype for t in tensors])
|
|
129
|
+
sparse = all(t.issparse() for t in tensors)
|
|
130
|
+
|
|
131
|
+
op = TensorStack(axis=axis, dtype=dtype, sparse=sparse)
|
|
132
|
+
return op(tensors, out=out)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
from ...datasource import empty, ones
|
|
21
|
+
from .. import stack
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_stack():
|
|
25
|
+
raw_arrs = [ones((3, 4), chunk_size=2) for _ in range(10)]
|
|
26
|
+
arr2 = stack(raw_arrs, axis=0)
|
|
27
|
+
|
|
28
|
+
assert arr2.shape == (10, 3, 4)
|
|
29
|
+
|
|
30
|
+
arr3 = stack(raw_arrs, axis=1)
|
|
31
|
+
|
|
32
|
+
assert arr3.shape == (3, 10, 4)
|
|
33
|
+
|
|
34
|
+
arr4 = stack(raw_arrs, axis=2)
|
|
35
|
+
|
|
36
|
+
assert arr4.shape == (3, 4, 10)
|
|
37
|
+
|
|
38
|
+
with pytest.raises(ValueError):
|
|
39
|
+
raw_arrs2 = [ones((3, 4), chunk_size=2), ones((4, 3), chunk_size=2)]
|
|
40
|
+
stack(raw_arrs2)
|
|
41
|
+
|
|
42
|
+
with pytest.raises(np.AxisError):
|
|
43
|
+
stack(raw_arrs, axis=3)
|
|
44
|
+
|
|
45
|
+
with pytest.raises(np.AxisError):
|
|
46
|
+
stack(raw_arrs, axis=-4)
|
|
47
|
+
|
|
48
|
+
with pytest.raises(TypeError):
|
|
49
|
+
stack(raw_arrs, out=1)
|
|
50
|
+
|
|
51
|
+
with pytest.raises(ValueError):
|
|
52
|
+
stack(raw_arrs, empty((1, 10, 3, 4)))
|