---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[4], line 4
2 for scale in [1.0, 2.0]:
3 feature_name = f"features_summary_scale{scale}"
----> 4 sq.im.calculate_image_features(
5 adata,
6 img.compute(),
7 features="summary",
8 key_added=feature_name,
9 scale=scale,
10 )
13 # combine features in one dataframe
14 adata.obsm["features"] = pd.concat(
15 [adata.obsm[f] for f in adata.obsm.keys() if "features_summary" in f],
16 axis="columns",
17 )
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_feature.py:91, in calculate_image_features(adata, img, layer, library_id, features, features_kwargs, key_added, copy, n_jobs, backend, show_progress_bar, **kwargs)
88 n_jobs = _get_n_cores(n_jobs)
89 start = logg.info(f"Calculating features `{list(features)}` using `{n_jobs}` core(s)")
---> 91 res = parallelize(
92 _calculate_image_features_helper,
93 collection=adata.obs_names,
94 extractor=pd.concat,
95 n_jobs=n_jobs,
96 backend=backend,
97 show_progress_bar=show_progress_bar,
98 )(adata, img, layer=layer, library_id=library_id, features=features, features_kwargs=features_kwargs, **kwargs)
100 if copy:
101 logg.info("Finish", time=start)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/_utils.py:168, in parallelize.<locals>.wrapper(*args, **kwargs)
165 else:
166 pbar, queue, thread = None, None, None
--> 168 res = jl.Parallel(n_jobs=n_jobs, backend=backend)(
169 jl.delayed(runner if use_runner else callback)(
170 *((i, cs) if use_ixs else (cs,)),
171 *args,
172 **kwargs,
173 queue=queue,
174 )
175 for i, cs in enumerate(collections)
176 )
178 if thread is not None:
179 thread.join()
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/joblib/parallel.py:1918, in Parallel.__call__(self, iterable)
1916 output = self._get_sequential_output(iterable)
1917 next(output)
-> 1918 return output if self.return_generator else list(output)
1920 # Let's create an ID that uniquely identifies the current call. If the
1921 # call is interrupted early and that the same instance is immediately
1922 # re-used, this id will be used to prevent workers that were
1923 # concurrently finalizing a task from the previous call to run the
1924 # callback.
1925 with self._lock:
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/joblib/parallel.py:1847, in Parallel._get_sequential_output(self, iterable)
1845 self.n_dispatched_batches += 1
1846 self.n_dispatched_tasks += 1
-> 1847 res = func(*args, **kwargs)
1848 self.n_completed_tasks += 1
1849 self.print_progress()
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_feature.py:119, in _calculate_image_features_helper(obs_ids, adata, img, layer, library_id, features, features_kwargs, queue, **kwargs)
107 def _calculate_image_features_helper(
108 obs_ids: Sequence[str],
109 adata: AnnData,
(...)
116 **kwargs: Any,
117 ) -> pd.DataFrame:
118 features_list = []
--> 119 for crop in img.generate_spot_crops(
120 adata, obs_names=obs_ids, library_id=library_id, return_obs=False, as_array=False, **kwargs
121 ):
122 if TYPE_CHECKING:
123 assert isinstance(crop, ImageContainer)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_container.py:830, in ImageContainer.generate_spot_crops(self, adata, spatial_key, library_id, spot_diameter_key, spot_scale, obs_names, as_array, squeeze, return_obs, **kwargs)
828 y = int(y - self.data.attrs[Key.img.coords].y0)
829 x = int(x - self.data.attrs[Key.img.coords].x0)
--> 830 crop = self.crop_center(y=y, x=x, radius=radius, library_id=obs_library_ids[i], **kwargs)
831 crop.data.attrs[Key.img.obs] = obs
832 crop = crop._maybe_as_array(as_array, squeeze=squeeze, lazy=False)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_container.py:661, in ImageContainer.crop_center(self, y, x, radius, **kwargs)
658 _assert_non_negative(yr, name="radius height")
659 _assert_non_negative(xr, name="radius width")
--> 661 return self.crop_corner( # type: ignore[no-any-return]
662 y=y - yr, x=x - xr, size=(yr * 2 + 1, xr * 2 + 1), **kwargs
663 )
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_container.py:568, in ImageContainer.crop_corner(self, y, x, size, library_id, scale, cval, mask_circle, preserve_dtypes)
565 else:
566 crop.attrs[Key.img.padding] = _NULL_PADDING
567 return self._from_dataset(
--> 568 self._post_process(
569 data=crop, scale=scale, cval=cval, mask_circle=mask_circle, preserve_dtypes=preserve_dtypes
570 )
571 )
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_container.py:602, in ImageContainer._post_process(self, data, scale, cval, mask_circle, preserve_dtypes, **_)
600 attrs = data.attrs
601 library_ids = data.coords["z"]
--> 602 data = data.map(_rescale).assign_coords({"z": library_ids})
603 data.attrs = _update_attrs_scale(attrs, scale)
605 if mask_circle:
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/dataset.py:6931, in Dataset.map(self, func, keep_attrs, args, **kwargs)
6929 if keep_attrs is None:
6930 keep_attrs = _get_keep_attrs(default=False)
-> 6931 variables = {
6932 k: maybe_wrap_array(v, func(v, *args, **kwargs))
6933 for k, v in self.data_vars.items()
6934 }
6935 if keep_attrs:
6936 for k, v in variables.items():
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/dataset.py:6932, in <dictcomp>(.0)
6929 if keep_attrs is None:
6930 keep_attrs = _get_keep_attrs(default=False)
6931 variables = {
-> 6932 k: maybe_wrap_array(v, func(v, *args, **kwargs))
6933 for k, v in self.data_vars.items()
6934 }
6935 if keep_attrs:
6936 for k, v in variables.items():
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/squidpy/im/_container.py:597, in ImageContainer._post_process.<locals>._rescale(arr)
591 shape[-2] = arr.shape[-2]
592 return xr.DataArray(
593 da.from_delayed(delayed(lambda arr: scaling_fn(arr).astype(dtype))(arr), shape=shape, dtype=dtype),
594 dims=arr.dims,
595 )
--> 597 return xr.DataArray(scaling_fn(arr).astype(dtype), dims=arr.dims)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/skimage/_shared/utils.py:328, in channel_as_last_axis.__call__.<locals>.fixed_func(*args, **kwargs)
324 raise ValueError(
325 "only a single channel axis is currently supported")
327 if channel_axis == (-1,) or channel_axis == -1:
--> 328 return func(*args, **kwargs)
330 if self.arg_positions:
331 new_args = []
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/skimage/transform/_warps.py:289, in rescale(image, scale, order, mode, cval, clip, preserve_range, anti_aliasing, anti_aliasing_sigma, channel_axis)
286 if multichannel: # don't scale channel dimension
287 output_shape[-1] = orig_shape[-1]
--> 289 return resize(image, output_shape, order=order, mode=mode, cval=cval,
290 clip=clip, preserve_range=preserve_range,
291 anti_aliasing=anti_aliasing,
292 anti_aliasing_sigma=anti_aliasing_sigma)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/skimage/transform/_warps.py:188, in resize(image, output_shape, order, mode, cval, clip, preserve_range, anti_aliasing, anti_aliasing_sigma)
184 zoom_factors = [1 / f for f in factors]
185 out = ndi.zoom(filtered, zoom_factors, order=order, mode=ndi_mode,
186 cval=cval, grid_mode=True)
--> 188 _clip_warp_output(image, out, mode, cval, clip)
190 return out
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/skimage/transform/_warps.py:692, in _clip_warp_output(input_image, output_image, mode, cval, clip)
689 min_val = min(min_val, cval)
690 max_val = max(max_val, cval)
--> 692 np.clip(output_image, min_val, max_val, out=output_image)
File <__array_function__ internals>:180, in clip(*args, **kwargs)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/numpy/core/fromnumeric.py:2152, in clip(a, a_min, a_max, out, **kwargs)
2083 @array_function_dispatch(_clip_dispatcher)
2084 def clip(a, a_min, a_max, out=None, **kwargs):
2085 """
2086 Clip (limit) the values in an array.
2087
(...)
2150
2151 """
-> 2152 return _wrapfunc(a, 'clip', a_min, a_max, out=out, **kwargs)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/numpy/core/fromnumeric.py:57, in _wrapfunc(obj, method, *args, **kwds)
54 return _wrapit(obj, method, *args, **kwds)
56 try:
---> 57 return bound(*args, **kwds)
58 except TypeError:
59 # A TypeError occurs if the object does have such a method in its
60 # class, but its signature is not identical to that of NumPy's. This
(...)
64 # Call _wrapit from within the except clause to ensure a potential
65 # exception has a traceback chain.
66 return _wrapit(obj, method, *args, **kwds)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/numpy/core/_methods.py:159, in _clip(a, min, max, out, casting, **kwargs)
156 return _clip_dep_invoke_with_casting(
157 um.maximum, a, min, out=out, casting=casting, **kwargs)
158 else:
--> 159 return _clip_dep_invoke_with_casting(
160 um.clip, a, min, max, out=out, casting=casting, **kwargs)
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/numpy/core/_methods.py:113, in _clip_dep_invoke_with_casting(ufunc, out, casting, *args, **kwargs)
111 # try to deal with broken casting rules
112 try:
--> 113 return ufunc(*args, out=out, **kwargs)
114 except _exceptions._UFuncOutputCastingError as e:
115 # Numpy 1.17.0, 2019-02-24
116 warnings.warn(
117 "Converting the output of clip from {!r} to {!r} is deprecated. "
118 "Pass `casting=\"unsafe\"` explicitly to silence this warning, or "
(...)
121 stacklevel=2
122 )
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/arithmetic.py:85, in SupportsArithmetic.__array_ufunc__(self, ufunc, method, *inputs, **kwargs)
76 raise NotImplementedError(
77 "xarray objects are not yet supported in the `out` argument "
78 "for ufuncs. As an alternative, consider explicitly "
79 "converting xarray objects to NumPy arrays (e.g., with "
80 "`.values`)."
81 )
83 join = dataset_join = OPTIONS["arithmetic_join"]
---> 85 return apply_ufunc(
86 ufunc,
87 *inputs,
88 input_core_dims=((),) * ufunc.nin,
89 output_core_dims=((),) * ufunc.nout,
90 join=join,
91 dataset_join=dataset_join,
92 dataset_fill_value=np.nan,
93 kwargs=kwargs,
94 dask="allowed",
95 keep_attrs=_get_keep_attrs(default=True),
96 )
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/computation.py:1267, in apply_ufunc(func, input_core_dims, output_core_dims, exclude_dims, vectorize, join, dataset_join, dataset_fill_value, keep_attrs, kwargs, dask, output_dtypes, output_sizes, meta, dask_gufunc_kwargs, on_missing_core_dim, *args)
1265 # feed DataArray apply_variable_ufunc through apply_dataarray_vfunc
1266 elif any(isinstance(a, DataArray) for a in args):
-> 1267 return apply_dataarray_vfunc(
1268 variables_vfunc,
1269 *args,
1270 signature=signature,
1271 join=join,
1272 exclude_dims=exclude_dims,
1273 keep_attrs=keep_attrs,
1274 )
1275 # feed Variables directly through apply_variable_ufunc
1276 elif any(isinstance(a, Variable) for a in args):
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/computation.py:315, in apply_dataarray_vfunc(func, signature, join, exclude_dims, keep_attrs, *args)
310 result_coords, result_indexes = build_output_coords_and_indexes(
311 args, signature, exclude_dims, combine_attrs=keep_attrs
312 )
314 data_vars = [getattr(a, "variable", a) for a in args]
--> 315 result_var = func(*data_vars)
317 out: tuple[DataArray, ...] | DataArray
318 if signature.num_outputs > 1:
File ~/miniconda3/envs/squid/lib/python3.10/site-packages/xarray/core/computation.py:847, in apply_variable_ufunc(func, signature, exclude_dims, dask, output_dtypes, vectorize, keep_attrs, dask_gufunc_kwargs, *args)
845 data = as_compatible_data(data)
846 if data.ndim != len(dims):
--> 847 raise ValueError(
848 "applied function returned data with an unexpected "
849 f"number of dimensions. Received {data.ndim} dimension(s) but "
850 f"expected {len(dims)} dimensions with names {dims!r}, from:\n\n"
851 f"{short_array_repr(data)}"
852 )
854 var = Variable(dims, data, fastpath=True)
855 for dim, new_size in var.sizes.items():
ValueError: applied function returned data with an unexpected number of dimensions. Received 4 dimension(s) but expected 0 dimensions with names (), from:
array([[[[100.5 , ..., 111.375 ]],
...,
[[ 91.75 , ..., 80.6875]]],
...,
[[[116. , ..., 114. ]],
...,
[[120.25 , ..., 112.25 ]]]])
Description
Hi,
I'm seeing some errors when following Analyze Visium H&E data. In particular,
calculate_image_features()returns this error message:This is my
environment.yml.I would have liked to import the
environment.yml, but the link to it is broken. I'd appreciate it greatly if anyone could advise.Version
squidpy==1.2.3